Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können Sie Dateien mit geringer Dichte in Go effizient kopieren, ohne sie aufzublähen?

Wie können Sie Dateien mit geringer Dichte in Go effizient kopieren, ohne sie aufzublähen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-03 17:06:02645Durchsuche

How Do You Efficiently Copy Sparse Files in Go Without Bloating?

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:

  1. Ordnen Sie syscall.Seek() auf lseek(2) auf unterstützten Plattformen zu.
  2. Bestimmen Sie die korrekten Werte für SEEK_HOLE und SEEK_DATA für Ihre Zielplattformen, da diese variieren können.

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

  • Einige Dateisysteme, wie z. B. FAT, unterstützen keine Löcher.
  • Überprüfen Sie, ob sich Quelle und Ziel im selben Dateisystem befinden, um die Verwendung von syscall.Rename() für eine schnellere Dateiverschiebung ohne Kopieren von Daten in Betracht zu ziehen.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn