Gibt es eine Methode, um schnell zu bestimmen, ob ein Stück, das aus einer (spärlichen) Datei gelesen wurde, alle Nullen sind?
-
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?
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.