Esiste un metodo per determinare rapidamente se un pezzo di leggere da un file (sparso) è tutti gli zeri?
-
26-10-2019 - |
Domanda
Esiste un metodo per determinare rapidamente se una (4KB-16MB) pezzo lette da un file è tutti zeri?
È possibile iterare il pezzo, controllando ogni byte. Ci sono evidenti ottimizzazioni, ma rimane O (N).
Il mio caso d'uso è per i file sparsi. Sarei perfettamente felice per una soluzione parziale, in modo tale che se il pezzo che ho appena letto non è sostenuta da alcun storage su disco (cioè si tratta di un buco) per poi tornare vero.
Eventuali suggerimenti?
Soluzione
Questo dipende dal sistema operativo e, talvolta, il filesystem. Linux dal 2.6.28 ha attuato la FIEMAP
ioctl()
, e ZFS su strumenti di Solaris SEEK_HOLE
e SEEK_DATA
in lseek()
.
Altri suggerimenti
Il mio primo pensiero è stato: "Come fa rsync farlo?"
Si scopre che rsync semplicemente controlla i dati per blocchi di zeri, e li scrive come file sparsi. Vedere fileio.c
nel codice sorgente rsync se si desidera che i dettagli cruenti.