0

私の問題は、アプリケーションが何千ものファイルをロードするのに時間がかかりすぎることです。はい、時間がかかることは承知していますが、少しでも速くしたいと思っています。「ロード」とは、ファイルを開いて記述子を取得し、最初の 100 バイト程度を読み取ることです。

したがって、私の主な戦略は、すべてのファイルを (内容を読み取らずに) 開いたり閉じたりする 2 番目のスレッドを作成することでした。これは、スレッドがメイン スレッドよりも先に実行され、OS がこれらのファイル記述子を事前にキャッシュしていると推測しているため、メイン スレッドがそれらを開くとすぐに開くため、役立つようです。メインスレッドがこれらのファイルから読み込まれたデータを解析している間に、スレッドがこれらのファイル記述子のキャッシュを開始できるため、これは実際に役立ちました。

だから私の本当の質問は...これをより速くするために他に何ができるでしょうか? どのようなアプローチがありますか? 誰もこれを成功させましたか?

OS のプリフェッチ呼び出しについて聞いたことがありますが、それは仮想メモリ ページ用でした。OS に通知する方法はありますか? これらのファイルはすべてすぐに必要になります。事前にファイルを収集しておくことをお勧めします。私の先読みスレッドはかなり粗雑です。

使用できる低レベルのディスク技術はありますか? 役立つファイル アクセスのパターンはありますか? 現在、読み込まれるファイルはすべて同じフォルダーから取得されます。それらがディスク上の正確にどこにあるのか、どの順序でファイルを開くのがディスクにとって最も速いかを判断する方法はないと思います。また、ディスクには、これを可能な限り効率的にするためのハードウェアがいくつかあると推測しています。

私のアプリケーションは主に Windows 用ですが、Unix の提案も役立ちます。

それが違いを生む場合、私はC++でプログラミングしています。

ありがとう - ジュリアン

4

1 に答える 1

0

私が最初に考えたのは、これをプログラム レベルで回避するのは難しいだろうということです。

Linux と OSX は、Windows よりもわずかな時間で、このような数千のファイルにアクセスできることがわかります。あなたがマシンをどれだけコントロールできるかわかりません。何千ものファイルを FAT パーティションに保持できる場合は、NTFS よりも優れた結果が得られるはずです。

これらのファイルをスキャンする頻度と変更する頻度。比率が読み取り側に大きくある場合は、各ファイルの先頭をキャッシュにコピーするのが理にかなっています。キャッシュには、1,000 個のファイルそれぞれのファイル名、変更時刻、および 100 バイトを格納できます。

于 2011-10-12T02:58:02.670 に答える