¿Existe un método para determinar rápidamente si una parte de un archivo (escaso) es todos ceros?

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

  •  26-10-2019
  •  | 
  •  

Pregunta

¿Existe un método para determinar rápidamente si un fragmento (4KB-16MB) se lee de un archivo es todos ceros?

Puedes iterar sobre el trozo, revisando cada byte. Hay optimizaciones obvias, pero sigue siendo o (n).

Mi caso de uso es para archivos dispersos. Estaría perfectamente feliz por una solución parcial, de modo que si la fragmentación que acabo de leer no está respaldada por ningún almacenamiento de disco (es decir, es un agujero), entonces regrese verdadero.

¿Alguna pista?

¿Fue útil?

Solución

Esto depende del sistema operativo y, a veces, del sistema de archivos. Linux desde 2.6.28 ha implementado el FIEMAP ioctl(), y ZFS en implementos de Solaris SEEK_HOLE y SEEK_DATA en lseek().

Otros consejos

Mi primer pensamiento fue: "¿Cómo lo hace Rsync?"

Resulta que RSYNC simplemente verifica los datos en busca de bloques de ceros y los escribe como archivos escasos. Ver fileio.c En el código fuente RSYNC si desea los detalles sangrientos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top