En informática, un archivo disperso es un tipo de archivo de ordenador que intenta utilizar más eficientemente el espacio del sistema de archivos[1] cuando los bloques (el espacio) asignados a los archivos están en su mayor parte vacíos.[2]
Esto se consigue escribiendo una breve información (metadatos) representando los bloques vacíos en el disco en vez del verdadero espacio "vacío" que constituye el bloque, utilizando así menos espacio en disco. El tamaño del bloque completo se escribe en el disco como el tamaño real solo cuando el bloque contiene "datos reales" (no vacíos). Al leer los archivos dispersos, el sistema de archivos de forma transparente convierte los metadatos que representan los bloques vacíos en bloques llenos de bytes ceros en tiempo de ejecución, por lo que la aplicación no es consciente de esta conversión.
La mayoría de los sistemas de archivos modernos soportan archivos dispersos, incluyendo la mayoría de variantes de Unix y NTFS,[3] pero no de HFS+. Los archivos dispersos se utilizan comúnmente para imágenes de disco, copia de bases de datos, archivos de registro y en aplicaciones científicas.
La ventaja de los archivos dispersos es que el almacenamiento solo se asigna cuando realmente se necesita: el espacio de disco se guarda, y se pueden crear archivos de gran tamaño incluso si no hay suficiente espacio libre en el sistema de archivos.
Algunos de los principales inconvenientes son:
Los archivos dispersos se manejan de forma transparente para el usuario. Pero las diferencias entre un archivo normal y un archivo disperso pueden llegar a ser visibles en algunas situaciones.
El comando Unix:
dd if=/dev/null of=archivo-disperso-file bs=1k seek=5120
creará un archivo de cinco megabytes de tamaño, pero sin almacenar datos en el disco (solo metadatos). (GNU dd tiene este comportamiento porque llama a ftruncate para establecer el tamaño de archivo; otras implementaciones pueden crear un archivo vacío.)
De la misma forma, si está disponible, puede usarse el comando truncate:
truncate -s 5M <nombredearchivo>
Los archivos dispersos tienen un tamaño aparente distinto del tamaño real. Esto se puede detectar comparando la salida de
du -B1 archivo-disperso
con
ls -l archivo-disperso
(Algunos sistemas no soportan la opción -B1 ; Puede utilizarse du -k, que reporta la información en kibibytes.)
Normalmente, la versión GNU de cp es buena detectando si el archivo es disperso, así que basta con ejecutar:
cp archivo-disperso nuevo-archivo
y nuevo-archivo será disperso. Sin embargo, el comando cp de GNU tiene una opción --sparse=WHEN
.[4] Esto es especialmente útil si el archivo disperso de alguna manera deja de serlo (p.e. los bloques vacíos se han escrito a disco en su totalidad). El espacio en disco puede recuperarse haciendo:
cp --sparse=always anterior-archivo-disperso archivo-disperso-recuperado
La mayoría de las implementaciones cp no soportan la opción --sparse
y siempre expandirán los archivos dispersos, como el comando cp de FreeBSD. Una alternativa parcialmente viable para estos sistemas es utilizar rsync con su propia opción --sparse
[5] en vez de cp. Desafortunadamente no se puede combinar --sparse
con --inplace
, así que aplicar rsync sobre archivos de mucho tamaño sobre la red será siempre una pérdida tanto de ancho de banda en red como en disco.
cat algúarchivo | cp --sparse=always /proc/self/fd/0 nuevo-archivo-disperso
--sparse
and --inplace