6

ハード ドライブのディレクトリを走査し、すべてのファイルから特定の検索文字列を検索したいと考えています。これは、IO がかなり遅いため、並行して実行できる (または実行する必要がある) 何かの完璧な候補のように思えます。

従来、現在のディレクトリ内のすべてのファイルを検索して処理し、そのディレクトリ内のすべてのディレクトリに再帰する再帰関数を記述していました。これをどのように変更してより並列化できるか疑問に思っています。最初は単純に変更しました:

foreach (string directory in directories) { ... }

Parallel.ForEach(directories, (directory) => { ... }) 

しかし、これはあまりにも多くのタスクを作成し、特に UI スレッドにディスパッチしようとするときに、結び目を作る可能性があると感じています。また、タスクの数は予測不可能であり、これはこのタスクを並列化する効率的な方法ではない可能性があると感じています (それは言葉ですか?)。

以前にこのようなことを成功させた人はいますか? その際、どのようなアドバイスがありますか。

4

1 に答える 1

15

いいえ、 IO が遅いという理由だけで、これは並列処理の良い候補とは思えません。あなたはディスクバウンドになるでしょう。ディスクが 1 つしかないと仮定すると、同時に複数の異なる場所をシークする必要はありません。

これは、水を早く出すために同じ蛇口に複数のホースを取り付けようとするようなものです。または、1 つのコアで 16 個の CPU バウンド スレッドを実行しようとするようなものです :)

于 2010-11-10T22:52:37.937 に答える