比較 (例) du -bm
du -m
まで .
-b
--apparent-size --block-size=1
を設定します 、しかしその後 m
ブロックサイズをオーバーライドして 1M
にします .
-bh
と同様 対 -h
:-bh
--apparent-size --block-size=1 --human-readable
を意味します 、そして再び h
そのブロックサイズをオーバーライドします。
見た目のサイズ アプリケーションがファイル内にあると考えるバイト数です。これは、FTP または HTTP 経由でファイルを送信することにした場合に、ネットワーク経由で転送されるデータの量です (プロトコル ヘッダーはカウントされません)。 cat theFile | wc -c
の結果でもあります 、および mmap
を使用して全体をロードした場合にファイルが占有するアドレス空間の量 .
ディスク使用量 ファイルがそのスペースを占有しているため、他の何かに使用できないスペースの量です。
ほとんどの場合、ディスク使用量はファイルの最後の (部分的な) ブロックのフル サイズをカウントし、見かけのサイズはその最後のブロック内のデータのみをカウントするため、見かけのサイズはディスクの使用量よりも小さくなります。ただし、スパース ファイルがある場合は見かけのサイズが大きくなります (スパース ファイルは、ファイルの末尾を超えてどこかをシークし、そこに何かを書き込むと作成されます。OS は、ゼロで満たされた多数のブロックを作成することを気にしません。 - 書き込むことを決定したファイルの部分のブロックのみを作成します)。
最小ブロック粒度の例
何が起こっているか見てみましょう。
mount
/
にマウントされた ext4 パーティションにいることがわかります .
そのブロックサイズは次のように見つけます:
stat -fc %s .
4096
サイズが 1 4095 4096 4097
のファイルをいくつか作成しましょう。 :
#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
dd if=/dev/zero of=f bs=1 count="${size}" status=none
echo "size ${size}"
echo "real $(du --block-size=1 f)"
echo "apparent $(du --block-size=1 --apparent-size f)"
echo
done
結果は次のとおりです。
size 1
real 4096 f
apparent 1 f
size 4095
real 4096 f
apparent 4095 f
size 4096
real 4096 f
apparent 4096 f
size 4097
real 8192 f
apparent 4097 f
したがって、4096
以下の値が表示されます。 4096
を消費します
そして、4097
を越えるとすぐに 、それは 8192
まで上がります これは 2 * 4096
です .
ディスクが常に 4096
のブロック境界にデータを格納することは明らかです バイト。
スパース ファイルはどうなりますか?
正確な表現が何であるかは調査していませんが、 --apparent
であることは明らかです 考慮します。
これにより、見かけのサイズが実際のディスク使用量よりも大きくなる可能性があります。
例:
dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f
与えます:
8192 f
1073741825 f
関連:スパース ファイルがサポートされているかどうかをテストする方法
大量の小さなファイルを保存したい場合はどうすればよいですか?
いくつかの可能性は次のとおりです:
- ファイル システムの代わりにデータベースを使用する:データベース vs ファイル システム ストレージ
- ブロックのサブアロケーションをサポートするファイル システムを使用する
参考文献:
- https://serverfault.com/questions/565966/which-block-sizes-for-millions-of-small-files
- https://askubuntu.com/questions/641900/how-file-system-block-size-works
Ubuntu 16.04 でテスト済み。