Y at-il une méthode pour déterminer rapidement si un morceau lu à partir d'un fichier (rares) est tous les zéros?
-
26-10-2019 - |
Question
Y at-il une méthode pour déterminer rapidement si un morceau (4Ko-16MB) lu à partir d'un fichier est tous les zéros?
Vous pouvez itérer sur le morceau, en vérifiant chaque octet. Il y a Optimisations évidentes, mais il reste O (N).
Mon cas d'utilisation est pour les fichiers rares. Je serais parfaitement heureux d'une solution partielle, de telle sorte que si le morceau que je viens de lire n'est pas sauvegardé par un stockage sur disque (à savoir qu'il est un trou), puis retourne true.
Les conseils?
La solution
This depends on the operating system and sometimes the filesystem. Linux since 2.6.28 has implemented the FIEMAP
ioctl()
, and ZFS on Solaris implements SEEK_HOLE
and SEEK_DATA
in lseek()
.
Autres conseils
My first thought was, "How does rsync do it?"
It turns out that rsync simply checks the data for blocks of zeroes, and writes them as sparse files. See fileio.c
in the rsync source code if you want the gory details.