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

47

Por alguna razón, cuando hago un archivo de texto en OS X, siempre es de al menos 4kB, a menos que esté en blanco. ¿Por qué es esto? ¿Podría haber 4.000 bytes de metadatos sobre 1 byte de texto sin formato?

ingrese la descripción de la imagen aquí

tkbx
fuente
17
4096 bytes, no 4000.
Caracol mecánico el
99
@Mechanicalsnail 4095. Olvidaste un byte de datos reales
Tobias Kienzler
66
@Mechanicalsnail es un año bisiesto, ¿no? xkcd.com/394 :P
tkbx

Respuestas:

52

El tamaño del bloque del sistema de archivos debe ser de 4 kB. Cuando los datos se escriben en un archivo que está 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.

Por lo general, 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 está usando 1 bloque 4K y solo un byte dentro de ese bloque contiene datos reales.

HeatfanJohn
fuente
10
Un comentario: en Windows, el tamaño real del archivo se muestra de forma predeterminada, y el tamaño del disco se muestra en el panel Opciones.
Joe Z.
Entonces, ¿puede un bloque acomodar diferentes archivos?
sudeepdino008
@ sudeepdino008 no, un bloque (al menos) para cada archivo (el sistema de archivos ext de Linux tiene / tenía (?) una opción para colocar varios archivos en un bloque, pero eso es una excepción a la regla)
Ro-ee
13

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, seguirá consumiendo un clúster o 4K en su sistema de archivos. El tamaño del clúster depende del sistema de archivos y las opciones del sistema de archivos.

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

Christopher
fuente
66
"Incluso si un tamaño de archivo es cero bytes, seguirá consumiendo un clúster". En realidad, no: en los sistemas de archivos Unix típicos, un archivo vacío consume un inodo y cero bloques, y no existe una noción de clúster que difiera de los bloques.
Gilles 'SO- deja de ser malvado'
8

Un pequeño experimento para ayudar a ilustrar esto:

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

[root@fedora17 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):

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


Ahora, nosotros lsel directorio. Usamos la -sopció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 especificarlo, --block-sizepero eso escala todo por ese valor, y también queremos ver el tamaño real del archivo en bytes) .

[root@fedora17 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 observar dos cosas:

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

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 manera, el tamaño aparente de un archivo puede ser mayor que el tamaño en disco.

Datos en linea

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

Jonathon Reinhart
fuente
Sí, tiene bastante razón, el 4k es el tamaño que utiliza el sistema de archivos para almacenar información sobre el almacenamiento del archivo dentro del sistema de archivos. Se almacenan cosas como el índice del archivo desde el comienzo de un bloque, el índice del bloque y el tamaño de la memoria utilizada por el archivo, que consumen hasta 4k. Esta información se utiliza para hacer referencia al archivo de texto del sistema de archivos.
pvn
3
Esto es incorrecto. Los metadatos de archivo como usted menciona no "comen" ninguno de los 4KiB. Esas estructuras son parte de la sobrecarga de formato del sistema de archivos. Vea mi respuesta arriba para la prueba. Si lo que dijiste es cierto, entonces mi archivo de 4096 bytes necesitaría más de un bloque.
Jonathon Reinhart
Los punteros al archivo (segmento no, blk no) en el sistema de archivos son las cosas que deben almacenarse y requieren la asignación de un bloque. Si el archivo de texto tiene muy poco contenido que pueda caber en el primer bloque ya asignado, entonces no requerirá la asignación del segundo bloque. Estoy de acuerdo en que todo el 4k no se usa para los metadatos y surge una fragmentación interna.
pvn
3
Estoy diciendo que ninguno de los 4 tamaños de bloque KiB se usa para metadatos. Creo que mi ejemplo lo demuestra.
Jonathon Reinhart
3
@pvn: Jonathon tiene razón. Los metadatos se almacenan en el inodo del archivo, que está separado del bloque utilizado para almacenar los datos del archivo.
Caracol mecánico