web-dev-qa-db-ja.com

テキストファイルに1バイトしかない場合でも、テキストファイルが4kB以上を占めるのはなぜですか。

なんらかの理由で、OS Xでテキストファイルを作成する場合、空白でない限り、常に少なくとも4 KBです。どうしてこれなの? 1バイトのプレーンテキストについて4,000バイトのメタデータがあるのでしょうか。

enter image description here

48
tkbx

ファイルシステムのブロックサイズは4 kBである必要があります。ファイルシステムに含まれているファイルにデータが書き込まれるとき、オペレーティングシステムは、ファイルに書き込まれるデータを含むためにストレージのブロックを割り当てる必要があります。

通常、ファイルシステムが作成されると、そのファイルシステムに含まれるストレージは、固定サイズのブロックにセグメント化されます。 このWikipediaの記事 は、このプロセスを簡単に説明しています。

このファイルのファイルシステムの基盤となるブロックサイズは、4Kバイトのブロックサイズでなければなりません。このファイルは1つの4Kブロックを使用しており、そのブロック内の1バイトのみが実際のデータを含んでいます。

54
HeatfanJohn

すべてのファイルシステムには、クラスターまたはブロックサイズ、またはファイルを保持するために割り当てることができる最小のディスク領域があります。実際のファイルサイズがクラスター/ブロックサイズよりも小さい場合でも、ファイルシステムでは1つのクラスター、つまり4Kを消費します。クラスタサイズは、ファイルシステムとファイルシステムオプションによって異なります。

Gillesが指摘 のようにゼロバイトが含まれている場合、ブロック/クラスターはゼロですが、典​​型的な* nixファイルシステムでは1つのiノードが使用されます。

13
Christopher

これを説明するのに役立つ小さな実験:

最初に、ルート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)です。次に、3つのファイルを作成しましょう。最初のファイルはゼロバイト、2番目のファイルは1バイト、3番目のファイルは4 KiB(ブロックサイズ)です。

[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


これで、ディレクトリがlsになりました。 -sオプションを使用すると、1024バイトの「ブロック」の数で、割り当てられたサイズ(左端の列)を確認できます。
(lsは実際のブロックサイズが4096であることを認識していません---block-sizeしかし、それはeverythingをその値でスケーリングし、actualファイルサイズもバイト単位)

[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

ここで2つのことに注意してください。

  • ゼロバイトのファイルはファイルシステムでゼロブロックを占有し、 Gilesが述べた を確認します。
  • 他の2つのファイルはファイルサイズが異なりますが、どちらも4 * 1024 = 1つの4KiB ext4ブロックを占有します。

スパースファイル

スパースファイルは、ゼロの大きなブロックを持つファイルです。データはすべてゼロであることがわかっているため、ディスクに保存しても意味がありません。このようにして、ファイルの見かけのサイズは実際にはディスク上のサイズよりも大きい場合があります。

インラインデータ

一部のファイルシステムでは、内容が非常に小さいファイルをinode自体に格納できることに注意してください。 nix/Linuxファイルシステムのiノード内に直接データを格納することは可能ですか? を参照してください。

8