単一のディレクトリに 1,000,000 個の個別のファイル (ほとんどの場合、サイズは 100k) があり、フラットに (他のディレクトリやファイルは含まれていません)、他の可能な方法で効率や不利な点で妥協することはありますか?
6 に答える
ARG_MAX はそれを問題にします...たとえば、 rm -rf * (ディレクトリにいる間) は「引数が多すぎます」と言います。ある種のグロビング (またはシェル) を実行したいユーティリティでは、いくつかの機能が中断されます。
そのディレクトリが公開されている場合 (たとえば、ftp や Web サーバー経由で)、別の問題が発生する可能性があります。
特定のファイル システムへの影響は、そのファイル システムに完全に依存します。これらのファイルはどのくらいの頻度でアクセスされますか? ファイル システムとは何ですか? Linux (デフォルト) は、設定に応じてプロセスをスワップに入れながら、最近アクセスしたファイルをメモリに保持することを優先することに注意してください。このディレクトリは http 経由で提供されますか? Google はそれを見てクロールしますか? その場合は、VFS キャッシュの圧力と swappiness を調整する必要があるかもしれません。
編集:
ARG_MAX は、プログラムのエントリ ポイントに提示できる引数の数に対するシステム全体の制限です。それでは、'rm' と例の "rm -rf *" を見てみましょう。シェルは '*' をスペースで区切られたファイルのリストに変換し、それが 'rm' の引数になります。
ls や他のいくつかのツールでも同じことが起こります。たとえば、「foo」で始まるファイルが多すぎると、ls foo* が壊れる可能性があります。
その理由だけで、(どのfsが使用されていても)小さなディレクトリチャンクに分割することをお勧めします。
ext3でdir_index
有効になっている大きなディレクトリでの私の経験:
- アクセスしたいファイルの名前がわかっていれば、ペナルティはほとんどありません。
- ディレクトリエントリ全体を読み取る必要のある操作(
ls
そのディレクトリの単純なものなど)を実行する場合は、初めて数分かかります。その後、ディレクトリはカーネルキャッシュに残り、ペナルティはなくなります。 - ファイルの数が多すぎると、ARG_MAXなどの問題が発生します。これは基本的に、ワイルドカード(
*
)が常に期待どおりに機能するとは限らないことを意味します。これは、本当にすべてのファイルに対して一度に操作を実行したい場合のみです。
しかし、それがなければdir_index
、あなたは本当に困惑しています:-D
ほとんどのディストリビューションでは、デフォルトでExt3が使用されます。これにより、大きなディレクトリに対して B ツリー インデックスを使用できます。一部のディストリビューションでは、このdir_index
機能がデフォルトで有効になっていますが、他のディストリビューションでは、自分で有効にする必要があります。有効にすると、数百万のファイルでも速度が低下しません。
機能がアクティブ化されているかどうかを確認するに dir_index
は (root として):
tune2fs -l /dev/sdaX | grep features
dir_index 機能を有効にするには (root として):
tune2fs -O dir_index /dev/sdaX
e2fsck -D /dev/sdaX
/dev/sdaX
アクティブ化するパーティションに置き換えます。
そのディレクトリで誤って「ls」を実行したり、タブ補完を使用したり、「rm *」を実行したくなったりすると、大変なことになります。また、ファイル システムによっては、パフォーマンスの問題が発生する場合があります。
ファイル名の最初の 2 文字または 3 文字で名前が付けられたディレクトリにファイルをグループ化することをお勧めします。
ああ/ aaavnj78t93ufjw4390 aaavoj78trewrwrwrwenjk983 aaaz84390842092njk423 ... abc/ abckhr89032423 abcnjjkth29085242nw ... ...
明らかな答えは、人間が技術的な制限のずっと前にフォルダを使用するのが非常に困難になるということです (1 つは ls からの出力を読み取るのに時間がかかりますが、他にも多くの理由があります)。分割できない正当な理由はありますか?サブフォルダに?
すべてのファイルシステムがそれほど多くのファイルをサポートしているわけではありません。
それらの一部 (ext2、ext3、ext4) では、inode 制限に達するのは非常に簡単です。