Perché un file di testo occupa almeno 4kB anche quando contiene solo un byte di testo?


47

Per qualche motivo, quando creo un file di testo su OS X, è sempre almeno 4kB, a meno che non sia vuoto. Perchè è questo? Potrebbero esserci 4.000 byte di metadati a circa 1 byte di testo normale?

inserisci qui la descrizione dell'immagine


17
4096 byte, non 4000.
Lumaca meccanica

9
@Mechanicalsnail 4095. Hai dimenticato un byte di dati effettivi
Tobias Kienzler,

6
@Mechanicalsnail è un anno bisestile, vero? xkcd.com/394 :P
tkbx il

Risposte:


52

La dimensione del blocco del file system deve essere di 4 kB. Quando i dati vengono scritti in un file contenuto in un file system, il sistema operativo deve allocare blocchi di archiviazione per contenere i dati che verranno scritti nel file.

In genere, quando viene creato un file system, la memoria contenuta in quel file system viene segmentata in blocchi di dimensioni fisse. Questo articolo di Wikipedia spiega brevemente questo processo.

La dimensione di blocco sottostante del file system per questo file deve avere una dimensione di blocco di 4K byte. Questo file utilizza 1 blocco 4K e solo un byte all'interno di quel blocco contiene dati effettivi.


10
Un commento: in Windows, la dimensione effettiva del file viene visualizzata per impostazione predefinita e la dimensione sul disco viene visualizzata nel riquadro Opzioni.
Joe Z.

quindi un blocco può ospitare file diversi?
sudeepdino008,

@ sudeepdino008 no, un blocco (almeno) per ogni file (il file system ext di Linux ha / aveva (?) un'opzione per mettere più file in un blocco, ma questa è un'eccezione alla regola)
Ro-ee,

13

Tutti i file system hanno dimensioni di cluster o blocchi o la minima quantità di spazio su disco che può essere allocata per contenere un file. Anche se la dimensione effettiva del file è inferiore alla dimensione del cluster / blocco, consumerà comunque un cluster o 4K sul file system. La dimensione del cluster dipende dal file system e dalle opzioni del file system.

Se contiene zero byte, come sottolineato da Gilles , usa zero blocchi / cluster ma un inode su file system * nix tipici, che risponde meglio al caveat, "a meno che non sia vuoto".


6
"Anche se una dimensione del file è zero byte, consumerà comunque un cluster". In realtà no: sui file system unix tipici, un file vuoto consuma un inode e zero blocchi, e non esiste alcuna nozione di cluster che differisce dai blocchi.
Gilles 'SO- smetti di essere malvagio' il

8

Un piccolo esperimento per aiutare a illustrare questo:

Innanzitutto, vediamo quali sono le dimensioni effettive del blocco della mia partizione 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

È 4096 (4 KiB), come previsto. Ora creiamo tre file: il primo è zero byte, il secondo è solo un byte e il terzo è 4 KiB (la dimensione del blocco):

[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


Ora, abbiamo lsla directory. Usiamo l' -sopzione per vedere la dimensione allocata (la colonna più a sinistra), in numero di "blocchi" da 1024 byte.
(Non sappiamo che la dimensione del blocco reale è 4096 - potremmo specificare --block-sizema che ridimensiona tutto di quel valore e vogliamo vedere anche la dimensione del file effettiva in byte) .

[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

Qui si possono notare due cose:

  • Il file zero byte occupa zero blocchi nel filesystem, confermando ciò che Giles ha dichiarato .
  • Anche se gli altri due file hanno dimensioni di file diverse, occupano entrambi 4 * 1024 = un blocco ext4 4KiB.

File sparsi

I file sparsi sono file con grandi blocchi di zeri. Poiché i dati sono noti per essere tutti pari a zero, non ha senso archiviarli sul disco. In questo modo, la dimensione apparente di un file può effettivamente essere maggiore della dimensione su disco.

Dati incorporati

Si noti che alcuni file system consentono di archiviare i contenuti di file molto piccoli nell'inode stesso. Vedere E 'possibile memorizzare i dati direttamente all'interno di un inode su un filesystem Unix / Linux? .


Sì, hai ragione, il 4K è la dimensione utilizzata dal file system per archiviare le informazioni relative alla memorizzazione del file all'interno del file system. Cose come l'indice del file dall'inizio di un blocco, l'indice del blocco e la dimensione della memoria utilizzata dal file vengono archiviati e consumano 4k. Queste informazioni vengono utilizzate per fare riferimento al file di testo dal file system.
pvn

3
Questo non è corretto I metadati dei file come dici tu non "divorano" nessuno dei 4KiB. Tali strutture fanno parte del sovraccarico di formattazione del filesystem. Vedi la mia risposta sopra per la prova. Se ciò che hai detto fosse vero, il mio file da 4096 byte avrebbe bisogno di più di un blocco.
Jonathon Reinhart il

I puntatori al file (segmento no, blk no) nel file system sono gli elementi che devono essere memorizzati e richiedono l'assegnazione di un blocco. Se il file di testo ha molto meno contenuto che può adattarsi al primo blocco già assegnato, non richiederà l'allocazione del secondo blocco. Concordo sul fatto che l'intero 4k non viene utilizzato per i metadati e sorgono frammentazioni interne.
pvn

3
Sto dicendo che nessuna delle 4 dimensioni del blocco KiB è usata per i metadati. Penso che il mio esempio lo dimostri.
Jonathon Reinhart,

3
@pvn: Jonathon ha ragione. I metadati sono memorizzati nell'inode per il file, che è separato dal blocco utilizzato per archiviare i dati del file.
Lumaca meccanica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.