Saltar al contenido

¿Por qué un archivo de texto ocupa al menos 4kB incluso cuando solo tiene un byte de texto?

Solución:

El tamaño de bloque del sistema de archivos debe ser de 4 kB. Cuando se escriben datos en un archivo contenido en un sistema de archivos, el sistema operativo debe asignar bloques de almacenamiento para contener los datos que se escribirán en el archivo.

Normalmente, cuando se crea un sistema de archivos, el almacenamiento contenido en ese sistema de archivos se segmenta en bloques de un tamaño fijo. Este artículo de Wikipedia explica brevemente este proceso.

El tamaño de bloque subyacente del sistema de archivos para este archivo debe tener un tamaño de bloque de 4 bytes. Este archivo usa 1 bloque de 4K y solo un byte dentro de ese bloque contiene datos reales.

Todos los sistemas de archivos tienen un tamaño de clúster o bloque, o la menor cantidad de espacio en disco que se puede asignar para contener un archivo. Incluso si el tamaño real del archivo es menor que el tamaño del clúster / bloque, consumirá un clúster o 4K en su sistema de archivos. El tamaño del clúster depende del sistema de archivos y de las opciones del sistema de archivos.

Si contiene cero bytes, como señaló Gilles, usa cero bloques / clústeres, pero un inodo en los típicos sistemas de archivos * nix, que responde mejor a la advertencia, “a menos que esté en blanco”.

Un pequeño experimento para ayudar a ilustrar esto:

Primero, veamos cuál es el tamaño de bloque real de mi partición raíz ext4 (LVM):

[[email protected] blocksize]# dumpe2fs /dev/mapper/vg_fedora17-lv_root | grep -i "block size"
dumpe2fs 1.42.3 (14-May-2012)
Block size:               4096

Es 4096 (4 KiB), como se esperaba. Ahora, creemos tres archivos: el primero es cero bytes, el segundo es solo un byte y el tercero es 4 KiB (el tamaño del bloque):

[[email protected] blocksize]# touch 0_bytes.bin
[[email protected] blocksize]# dd if=/dev/zero of=1_byte.bin bs=1 count=1
[[email protected] blocksize]# dd if=/dev/zero of=4096_bytes.bin bs=1 count=4096

Ahora nosotros ls El directorio. Usamos el -s opción para ver el tamaño asignado (la columna más a la izquierda), en número de “bloques” de 1024 bytes.
(ls no sabe que el tamaño real del bloque es 4096; podríamos especificar --block-size pero eso escala todo por ese valor, y queremos ver el real tamaño del archivo en bytes, también).

[[email protected] blocksize]# ls -ls
total 8
0 -rw-r--r--. 1 root root    0 Jan 21 23:56 0_bytes.bin
4 -rw-r--r--. 1 root root    1 Jan 21 23:38 1_byte.bin
4 -rw-r--r--. 1 root root 4096 Jan 21 23:38 4096_bytes.bin

Aquí se pueden señalar dos cosas:

  • El archivo de cero bytes ocupa cero bloques en el sistema de archivos, lo que confirma lo que dijo Giles.
  • Aunque los otros dos archivos tienen tamaños de archivo diferentes, ambos ocupan 4 * 1024 = un bloque ext4 de 4 KB.

Archivos dispersos

Los archivos dispersos son archivos con grandes bloques de ceros. Debido a que se sabe que los datos son todos cero, no tiene sentido almacenarlos en el disco. De esta forma, el tamaño aparente de un archivo puede ser mas grande que el tamaño en disco.

Datos en línea

Tenga en cuenta que algunos sistemas de archivos permiten que el contenido de archivos muy pequeños se almacene inodo sí mismo. Consulte ¿Es posible almacenar datos directamente dentro de un inodo en un sistema de archivos Unix / Linux ?.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *