Mucho ha cambiado en 8 años.
Falocar
fallocate -d
filename
se puede utilizar para perforar agujeros en archivos existentes. Desde el fallocate(1)
página man:
-d, --dig-holes
Detect and dig holes. This makes the file sparse in-place,
without using extra disk space. The minimum size of the hole
depends on filesystem I/O block size (usually 4096 bytes).
Also, when using this option, --keep-size is implied. If no
range is specified by --offset and --length, then the entire
file is analyzed for holes.
You can think of this option as doing a "cp --sparse" and then
renaming the destination file to the original, without the
need for extra disk space.
See --punch-hole for a list of supported filesystems.
(Esa lista:)
Supported for XFS (since Linux 2.6.38), ext4 (since Linux
3.0), Btrfs (since Linux 3.7) and tmpfs (since Linux 3.5).
tmpfs estar en esa lista es lo que me parece más interesante. El sistema de archivos en sí es lo suficientemente eficiente como para consumir solo la cantidad de RAM que necesita para almacenar su contenido, pero haciendo que el contenido escasa puede aumentar potencialmente esa eficiencia aún más.
GNU cp
Además, en algún lugar del camino GNU cp
adquirió una comprensión de los archivos dispersos. Citando el cp(1)
página de manual sobre su modo predeterminado, --sparse=auto
:
Los archivos SOURCE dispersos se detectan mediante una heurística cruda y el archivo DEST correspondiente también se vuelve disperso.
Pero también hay --sparse=always
, que activa el equivalente de copia de archivo de lo que fallocate -d
hace en el lugar:
Especifique --sparse=always
para crear un archivo DEST disperso siempre que el archivo SOURCE contenga una secuencia suficientemente larga de cero bytes.
Finalmente he podido retirar mis tar cpSf - SOURCE | (cd DESTDIR && tar xpSf -)
one-liner, que durante 20 años fue mi manera de copiar archivos dispersos con su escasez preservada.
Algunos sistemas de archivos en Linux/UNIX tienen la capacidad de "perforar agujeros" en un archivo existente. Ver:
- Publicación LKML sobre la función
- Preguntas frecuentes sobre el truncamiento de archivos UNIX (busque F_FREESP)
No es muy portátil y no se hace de la misma manera en todos los ámbitos; a partir de ahora, creo que las bibliotecas IO de Java no proporcionan una interfaz para esto.
Si la perforación de agujeros está disponible a través de fcntl(F_FREESP)
o a través de cualquier otro mecanismo, debería ser significativamente más rápido que un bucle de copia/búsqueda.
Creo que sería mejor preasignar todo el archivo y mantener una tabla/BitSet de las páginas/secciones que están ocupadas.
Hacer un archivo disperso daría como resultado que esas secciones se fragmentaran si alguna vez se reutilizaran. Tal vez ahorrar unos pocos TB de espacio en disco no valga la pena por el impacto en el rendimiento de un archivo altamente fragmentado.