Heim  >  Artikel  >  Backend-Entwicklung  >  ## Warum werden Dateien mit geringer Dichte beim Kopieren mit io.Copy() groß?

## Warum werden Dateien mit geringer Dichte beim Kopieren mit io.Copy() groß?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 04:03:27831Durchsuche

##  Why Do Sparse Files Become Large When Copied with io.Copy()?

Spärliche Dateien bleiben groß, wenn sie mit io.Copy() kopiert werden

Beim Kopieren dünner Dateien mit io.Copy() werden sie unerwartet groß groß am Ziel. Was kann getan werden, um dies zu verhindern?

Hintergrund

io.Copy() überträgt Rohbytes, ohne Kenntnis von spärlichen Dateieigenschaften zu haben. Sparsame Dateien werden effizient gespeichert, mit Lücken in den Daten. io.Copy() kann diese Lückeninformationen nicht kommunizieren, was zu einem Verlust an Sparseness während des Kopiervorgangs führt.

Lösung

Um dieses Problem zu beheben, müssen Sie umgehen io.Copy() und arbeiten Sie direkt mit dem Syscall-Paket. So geht's:

  • Löcher erkennen: Verwenden Sie die Sonderwerte SEEK_HOLE und SEEK_DATA in lseek(2), um Löcher und Datenbereiche in der Sparse-Datei zu lokalisieren.
  • Suchwerte anpassen: Plattformspezifische SEEK_HOLE- und SEEK_DATA-Werte sind erforderlich. Bestimmen Sie diese Werte für die unterstützten Plattformen.
  • Ändern Sie das Lesemuster: Identifizieren Sie datenhaltige Regionen und lesen Sie Daten aus ihnen.
  • Erwägen Sie File Punching: Unter Linux können Sie versuchen, mit fallocate(2) ein Loch am Ende der Zieldatei zu schlagen. Wenn dies nicht unterstützt wird, schreiben Sie auf Null gesetzte Blöcke, um eine Lücke zu simulieren.

Zusätzliche Überlegungen

  • Dateisystemunterstützung: Nicht alle Dateisysteme werden unterstützt Löcher wie FAT32. Überprüfen Sie, ob das Zieldateisystem Lücken unterstützt.
  • Unterschiede zwischen Quelle und Ziel: Überprüfen Sie, ob sich die Quell- und Zieldateien im selben Dateisystem befinden. Wenn ja, erwägen Sie die Verwendung von syscall.Rename() oder os.Rename(), um die Datei ohne Kopieren zu verschieben.

Weitere Einblicke finden Sie im Go-Problem Nr. 13548 zum Schreiben von Dateien mit geringer Dichte in TAR-Archiven .

Das obige ist der detaillierte Inhalt von## Warum werden Dateien mit geringer Dichte beim Kopieren mit io.Copy() groß?. 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