複数のファイルとマルチレベルディレクトリにデータを格納し、複数のスレッド(読み取りと書き込みの両方)からそれらにアクセスするアプリケーションのモジュールがあります。ディレクトリ構造は、次のような分割されたハッシュ値に基づいています。
b1/94/6a/92/a.txt
b1/94/6a/ee/a.txt
a1/0e/db/bb/b.txt
...
呼び出し元がファイルを削除すると、モジュールは空のディレクトリをすぐに削除します。
モジュールの同時実行レベルはどのくらいにする必要がありますか?複数のスレッドから同時にフォルダーを作成および削除する価値はありますか?ファイルシステムはこれらを効果的に処理できますか?
マルチスレッドモジュールを使用する価値はありますか? (シングルスレッドのものを書く方がはるかに簡単でしょう。)
(アプリケーションはJavaで記述されており、主にWindows、NTFS、非SSDで実行されますが、違いがある場合は他のオペレーティングシステムやファイルシステムにも興味があります。)
もちろん、どのOSでも複数の要求が処理されますが、シーク時間のある物理メディアに基づくファイルシステムに一度に複数の処理を実行するように依頼すると、パフォーマンスは徐々に低下します。私の経験では、リクエストをキューに入れ、OSに順番に渡すスレッドを1つだけ持つ方がパフォーマンス面で優れています。
1つのオプションは、このスレッドがリンク解除操作を分離し、発生しているデータ操作が少ないスラック時間を検出するまでそれらを保持し、それらのディレクトリを削除して、データ要求を可能な限り高速に保ち、ハウスキーピングを邪魔にならないようにすることです。
それは明らかにシンプルなソリューションですが、他の要件によって最適化または再編成が強制されるまで、シンプルでよいと思います。
アプリを確実にプロファイリングする必要があります。ファイルの使用方法によって異なりますが、悪い場合もあれば非常に良い場合もあります。少数のファイルの読み取りと書き込みのみを行う場合、それらのファイルはキャッシュされ、それらのブロックがバッファリングされます。しばらくディスクに触れない場合があります。
たくさんのファイルとディレクトリを作成し、作成したのと同じ速さでそれらを削除した場合、キャッシュとバッファは確実に破棄されます。スレッドの数に関係なく。
より多くのプロセス(スレッドではない)がある場合、ファイルシステム時間のシェアが大きくなります。
他のスレッドからのファイルの読み取り/書き込み要求を収集するスレッドがあることは、OSのジョブを複製するだけであり、通常OSは、時間を費やしたいよりも、それらの要求をスケジュールして並べ替えることができます。
ここで何をしようとしているのかはわかりませんが、ファイルシステムに直接アクセスするのではなく、データベースを使用することでニーズに応えることができないと確信しています。データベースは複数の同時リクエストを処理し、競合状態から保護するのに役立ちます。