web-dev-qa-db-ja.com

私の小さなファイルは正確にどのくらいのスペースを占めますか?

Tarはファイルを圧縮しないという印象を受けました。 100万個の小さなファイルをタール化​​したときの驚きを想像してみてください(du -h〜4.2G)、結果のタールはサイズの4分の1でした(ls -lh mytar.tar〜1.3G)!

明らかに、これらの小さなファイルは、報告されたサイズを超えて領域を占有しており、 別の質問への回答 は、空でない各ファイルが少なくともを占めることを示唆していますサイズに関係なく1KB。しかし、この1KBはどこから来ているのでしょうか、ファイルシステム間で異なりますか(これはext4です)、1.01 KBのファイルは2KBを占めますか?

つまり、実際のファイルサイズ、特にディレクトリ内の多くのファイルをどのように測定すればよいのでしょうか。私は試した du --apparent-size -hそして私は437Mしか得られないので、3つの大きく異なる数でかなり混乱しました。

3
Hooked

クリストファーが指摘しているように、この質問は テキストが1バイトしかないのに、テキストファイルが少なくとも4kBを占めるのはなぜですか?

個人的に重複として分類するかどうかはわかりません。

しかし、この1KBはどこから来たのですか

これはより一般的には4KBです

ファイルシステムは、個々のバイトではなく、バイトのブロック(別名アロケーションユニット)で割り当てられます。したがって、1バイトをファイルに格納するには、そのファイルにボック全体が必要になります。つまり、ブロックの残りの部分は空白のままですが、他のファイルはそれを使用できません。

この数の起源は不明ですが、それに適合するものがいくつかあります。たとえば、低レベルでは、ディスクに1バイトを書き込むことはできず、それらのブロックのみを書き込むことができます。最近のHDやSSDでさえ、多くの場合4KBの制限があります。つまり、1バイトを書き込む場合は、最初に4KBをロードし、その1バイトを変更して、ブロック全体を書き戻す必要があります。ブロック全体を書き込もうとした場合、元の内容を読み取る必要はありません。したがって、ハードウェアの制限に合わせたファイルシステムの方がはるかに効率的です。

Stephen Kittが指摘しているように、4KBは 多くのカーネルでext3でサポートされている最大ブロックサイズ です。 (また ここで説明 )。一般に、ブロックサイズが大きいほどアクセス時間が効率的になり、「ブロックが大きいほど良い」という意味になります。

ファイルシステム間で異なりますか(これはext4です)

かつては、512が一般的なブロックサイズでしたが、この数値はデフォルト値として時々表示されます。 tarファイルは非常に古く、これと同じ512バイトのブロックサイズを持っています(おそらくファイルシステムとハードウェアに合わせてディスクへの書き込みを非常に高速にしようとしています) 。そのようなtarファイルは非常に小さいファイル(<512バイト)ではまだ非常に無駄です

4KBに揃えられた(1KBではない)ファイルシステムを使用することは、今でははるかに一般的です。

そして、はい、ファイルシステムは、異なるブロックサイズを使用するようにフォーマットするときに構成できます。ファイルシステムによって制限は異なりますが、ほとんどのファイルシステムを構成できます。

1.01 KBのファイルは2KBを占有しますか?

1KBのブロックサイズを想定すると、そうです。

3
Philip Couling

この例のファイルシステムで単一のファイルに使用される平均スペースは4200バイトです。

Tarアーカイブのファイルオーバーヘッドは512バイトであるため、この例のファイルの平均サイズは800バイトです。

多くのファイルが800バイトより小さく、一部のファイルが4096バイトより少し大きく、ファイルシステムが4096バイトの内部ブロックサイズを使用しているが、4096バイトよりも小さいフラグメントを実装していない場合、あなたの主張は真実かもしれません。

すべてのファイルが4096バイトよりも小さい場合、duは4Gを報告するため、一部のファイルには2ブロック(4096バイト)が必要なようです。

0
schily