ファイルをサブフォルダとして構成すると、すべてのファイルを1つの大きなディレクトリに保存するよりも、ext4ファイルシステムで読み取りアクセスのパフォーマンスが向上しますか?
現在、600,000個のファイル(それぞれ3〜10MB)を含む大規模なディレクトリがあります。これらのファイルをそれぞれ5Kファイルを含むサブフォルダに構成すると、パフォーマンスが向上しますか?
そのようなベンチマークを実行するためのいくつかのツールを提案できますか?
追加情報として、これらのファイルをフルパスで読み取り、ディレクトリに新しいファイルを書き込む方法で使用します。さらに、以前のファイルよりも新しく作成されたファイルをより頻繁に読みます。
答え1
各3〜10MB
ファイルサイズは重要ではありません。
ファイルをサブフォルダとして構成すると、すべてのファイルを1つの大きなディレクトリに保存するよりも、ext4ファイルシステムで読み取りアクセスのパフォーマンスが向上しますか?
論理的には、「パフォーマンス」が意味するものによって異なります。みんなファイルをサブディレクトリに配置する方が悪いでしょう。表示したいサブディレクトリを知っていて、そのサブディレクトリだけを一覧表示すると、より高速になります。
興味深い場合は、名前でファイルにアクセスするだけで、ディレクトリリストをインポートする必要がない場合です。
現在、600,000個のファイル(それぞれ3〜10MB)を含む大規模なディレクトリがあります。これらのファイルをそれぞれ5Kファイルを含むサブフォルダに構成すると、パフォーマンスが向上しますか?
繰り返しますが、使用パターンによって異なります!ディレクトリがほとんどリストされていないように見えるので、その違いは大きくありません。
ディレクトリからファイルをインポートするには、次のようにします。
/path/to/file
パスはコンポーネント(->path
、、、)に分類されます。to
file
- 各ディレクトリに含まれるディレクトリのインデックスを要求する必要があります(したがって、表示するにはのインデックスを見て、インポートするにはのインデックスを見なければなりません
to
。to
path
file
file
to
to
path
明らかにルートが深いほど、より多くの検索が必要になるため、時間がかかります。
問題は、-filesインデックスでエントリを検索するのがN
インデックスで2回連続して検索するよりも時間がかかりますかsqrt(N)
? (したがって、この場合はN
ファイルをsqrt(N)
ディレクトリに配置し、sqrt(N)
各ディレクトリのエントリがあります。)
私の答えはいいえです。 Ext4の使用Bツリーこれは、ディレクトリエントリルックアップの最適化された実装が最初のlog[N]
場合に時間がかかり、漸近的である2·log[sqrt(N)] = 2·log[N^(1/2)] = 2·(1/2)·log[N] = log[N]
ことを意味します。
もちろんずっと見てください一つデータ構造は通常たくさん特に、「より深い」ディレクトリのインデックスを読み取るためにリポジトリに戻る必要がまったくないことを保証する場合、データの局所性の点で望ましいです。したがって、1 つの大きなディレクトリは、ルックアップ時間の観点から複数の小さなディレクトリよりも優れています。
これは重要ですか?私はそれを疑う。 600,000個のファイルはあまりありません。
しかし、、アプリケーションがスマートであれば、状況は異なります。すべてのディレクトリ記述子を一度だけ開き(後で使用するためにopenat
)、その構造をアプリケーションに保持する場合はもちろん会議より小さい指数を研究するだけで利点を得ることができます。ファイルを確実に読み直すことがわかっている場合は、ファイル記述子を開いたままにして、ある種の内部テーブルにしばらく保存するのが賢明かもしれません。これ重要open
かかる時間の一部は、ディレクトリ検索ではなく、close
ユーザーとファイルの間で発生するコンテキスト切り替えにある可能性があります。
答え2
それ極度にディレクトリに何百ものファイルを置くことは賢明ではありません。
- 中断などによりファイルシステムエラーが発生することがあります。みんなファイルに一時的または永続的にアクセスできません。
- ファイルシステムキャッシュはあらかじめすべてのアイテムで汚染されています。
- すべてのアイテム(リストと検索操作を含む)を生成するために必要な大量のデータとカーネル操作のため、複数の操作は完了しません。
あなたのユースケースにFSストレージが必要かどうかはわかりません。 NoSQLを含むデータベースを検討できます。