テキストファイルが4 KBなのはなぜですか?


47

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

ここに画像の説明を入力してください


16
4000ではなく4096バイト
機械式カタツムリ

8
@Mechanicalsnail4095。実際のデータの1バイトを忘れてしまった
トビアスキーンズラー

5
@Mechanicalsnailうるう年ですね。xkcd.com/394 :P
tkbx

回答:


52

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

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

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


10
コメント:Windowsでは、デフォルトで実際のファイルサイズが表示され、ディスク上のサイズが[オプション]ペインに表示されます。
ジョーZ.

ブロックは異なるファイルに対応できますか?
-sudeepdino008

@ sudeepdino008いいえ、各ファイルに1ブロック(少なくとも)(Linuxのextファイルシステムには複数のファイルを1ブロックに入れるオプションがありますが、これはルールの例外です)
Ro-ee

13

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

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


6
「ファイルサイズがゼロバイトであっても、1つのクラスターを消費します。」実際、いいえ:通常のUNIXファイルシステムでは、空のファイルは1つのiノードとゼロのブロックを消費し、ブロックと異なるクラスターの概念はありません。
ジル 'SO-悪であるのをやめる'

8

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

まず、ルート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つのファイルを作成します。最初のファイルは0バイト、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が、その値ですべてをスケーリングします。実際のファイルサイズもバイト単位で表示します)

[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ブロックを占有します。

スパースファイル

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

インラインデータ

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


はい、非常に正しいです。4kは、ファイルシステム内のファイルのストレージに関する情報を保存するためにファイルシステムが使用するサイズです。ブロックの先頭からのファイルのインデックス、ブロックのインデックス、ファイルで使用されるメモリのサイズなど、4kを消費するものが保存されます。この情報は、ファイルシステムからテキストファイルを参照するために使用されます。
pvn

2
これは間違っています。あなたが言及したようなファイルのメタデータは、4KiBを「食い尽くす」ことはありません。これらの構造は、ファイルシステムのフォーマットのオーバーヘッドの一部です。証拠については上記の私の答えをご覧ください。あなたの言ったことが本当なら、私の4096バイトのファイルには複数のブロックが必要になります。
ジョナサンラインハルト

ファイルシステム内のファイル(セグメント番号、ブロック番号)へのポインタは、格納する必要があるものであり、1つのブロックを割り当てる必要があります。テキストファイルのコンテンツが非常に少なく、既に割り当てられている最初のブロックに収まる場合は、2番目のブロックを割り当てる必要はありません。4k全体がメタデータに使用されておらず、内部で断片化が発生していることに同意します。
pvn

2
私は、4 KiBブロックサイズのいずれもメタデータに使用されていないと言ってます。私の例がそれを証明していると思います。
ジョナサンラインハルト

2
@pvn:Jonathonは正しい。メタデータは、ファイルのiノードに保存されます。これは、ファイルデータの保存に使用されるブロックとは別です。
機械式カタツムリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.