Heim > Artikel > Backend-Entwicklung > Wie können Sie Dateien mit geringer Dichte in Go effizient kopieren, ohne sie aufzublähen?
Sparse-Dateien blähen sich mit io.Copy() auf
Beim Kopieren von Dateien mit io.Copy() neigen große, spärliche Dateien dazu, unverhältnismäßig stark anzuschwellen an ihrem Ziel. Dieses Verhalten ist auf die Verarbeitung von Rohbytes durch io.Copy() zurückzuführen, dem die Möglichkeit fehlt, Informationen über Dateilücken zu übermitteln.
Umgang mit Lücken
Zur Verwaltung von Lücken , müssen Sie tiefer in das Syscall-Paket eintauchen und an den Werten SEEK_HOLE und SEEK_DATA für lseek(2) herumbasteln. Leider sind diese Werte im Standard-Syscall-Paket oder seinem golang.org/x/sys-Gegenstück nicht vorhanden.
Lösung
Um dieses Problem zu beheben, führen Sie die folgenden Schritte aus:
Unter Linux können Sie beispielsweise Folgendes verwenden:
// +build linux const ( SEEK_DATA = 3 SEEK_HOLE = 4 )
Sparse-Dateien lesen und übertragen
Datenbereiche erkennen und daraus lesen sie beim Lesen von spärlichen Dateien. Für die Übertragung von Dateien mit intakter Sparseness ist der Prozess komplizierter und erfordert plattformspezifische Überlegungen.
Linux-spezifischer Ansatz
Verwenden Sie unter Linux fallocate(2) mit FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, um am Ende der Datei ein Loch zu stanzen. Wenn dies fehlschlägt, schaufeln Sie auf Null gesetzte Blöcke, um das Loch zu schließen.
Zusätzliche Hinweise
Das obige ist der detaillierte Inhalt vonWie können Sie Dateien mit geringer Dichte in Go effizient kopieren, ohne sie aufzublähen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!