GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo hacer que el archivo sea disperso?

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.


Linux
  1. Cómo hacer una VPN

  2. Cómo ordenar un archivo en el lugar

  3. ¿Cómo hacer que ssh inicie sesión como el usuario correcto?

  4. ¿Cómo hago para que `ls` muestre el tamaño de los archivos en megabytes?

  5. ¿Cómo hago que un archivo NO sea modificable?

Cómo crear un archivo Tar Gz

Cómo descomprimir (abrir) un archivo Gz

Cómo hacer un archivo ejecutable en Linux

Cómo vincular un archivo en Linux

¿Cómo hacer un archivo ejecutable en la terminal de Linux?

Cómo hacer eco en un archivo