Gibt es eine Methode, um schnell zu bestimmen, ob ein Stück, das aus einer (spärlichen) Datei gelesen wurde, alle Nullen sind?

StackOverflow https://stackoverflow.com/questions/7818439

  •  26-10-2019
  •  | 
  •  

Frage

Gibt es eine Methode, um schnell zu bestimmen, ob ein (4KB-16MB) Chunk-Lesen aus einer Datei alle Nullen ist?

Sie können über das Stück iterieren und jedes Byte überprüfen. Es gibt offensichtliche Optimierungen, aber es bleibt o (n).

Mein Anwendungsfall ist für spärliche Dateien. Ich würde mich vollkommen über eine teilweise Lösung freuen, so dass, wenn das Chunk, das ich gerade gelesen habe, nicht durch einen Speicher Speicher unterstützt wird (dh es ist ein Loch), dann zurückkehren.

Irgendwelche Hinweise?

War es hilfreich?

Lösung

Dies hängt vom Betriebssystem und manchmal vom Dateisystem ab. Linux seit 2.6.28 hat die implementiert FIEMAP ioctl(), und ZFS über Solaris -Geräte SEEK_HOLE und SEEK_DATA in lseek().

Andere Tipps

Mein erster Gedanke war: "Wie macht RSYNC das?"

Es stellt sich heraus, dass RSYNC die Daten einfach nach Nullenblöcken überprüft und sie als spärliche Dateien schreibt. Sehen fileio.c im RSYNC -Quellcode, wenn Sie die blutigen Details wünschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top