1

コードで並列forループを使用して、多数のエンティティ(12,000)で長時間実行されるプロセスを実行しています。

このプロセスは文字列を解析し、いくつかの入力ファイルを調べ(IOベースのものの数を考えると、スレッド化の利点は疑わしいかもしれませんが、他の場所ではスピードアップしたようです)、一致した結果を出力します。

最初は、プロセスは非常に高速に進行しますが、最終的にはクロールが遅くなります。特にトリッキーな入力データの数にヒットした可能性がありますが、これは物事を詳しく調べている可能性は低いようです。

ループ内に、反復の開始/終了時に「Started Processing:」と「FinishedProcessing:」を出力するデバッグコードを追加し、最初にどのIDであるかを見つけるために、開始と終了をペアにするプログラムを作成しました。クラッシュを引き起こします。

ただし、一致しないIDの数を見ると、プログラムは一度に400を超える異なるエンティティを処理しているように見えます。これは、IOの数が多い場合、問題の原因である可能性があるようです。

だから私の質問はこれ(これら)です:

  • 一致しないIDを適切に解釈していますか、それとも、欠落している舞台裏で巧妙なものがありますか、それとも明らかなものがありますか?
  • 私が見つけたものが正しいことに同意する場合、スピンオフして一度に実行する数を制限するにはどうすればよいですか?

これはおそらくやや非正統的な質問であり、コードがないため答えるのが難しいかもしれませんが、助けていただければ幸いです。さらに情報が必要な場合は、コメントでお知らせください。

4

2 に答える 2

2

いくつかのコードを見なくても、私はあなたの質問に対する答えを推測することができます:

  • 一致しないIDは、そのデータを処理しているスレッドの優先順位が下げられていることを示しています。これは、IOまたはスレッドプールが最適化しようとしていることが原因である可能性がありますが、IOバウンドが強い場合は、それが問題である可能性が高いようです。
  • Parallel.Forを見てみましょう。具体的には、 ParallelOptions.MaxDegreesOfParallelismを使用して、タスクの最大数を適切な数に制限します。お持ちのプロセッサコアの数から始めて、最適な度数を決定するための試行錯誤をお勧めします。

幸運を!

于 2012-11-27T16:39:45.890 に答える
0

まず、ハードドライブから2つのファイルを同時に読み取ることは非常に悪い考えであることを確認することから始めましょう(少なくとも、HDの大部分がSSDになるまで)。もちろん、使用している番号はどれでもかまいません。並列処理を使用すると、CPU能力である、実際に並列化可能なリソースを使用して処理を最適化できます。プロセスの読み取りをハードドライブから並列化すると、ほとんどのメリットが失われます。

そしてそれでも、CPUパワーでさえ無限の並列化の傾向はありません。通常のデスクトップCPUには、同時に最大10個のスレッドを実行する能力があります(モデルによって異なりますが、それは桁違いです)。

だから2つのこと

  • まず、エンティティがすべてのファイルを使用していると仮定しますが、ファイルは大きすぎてメモリにロードできません。その場合は、ファイルをオブジェクト(つまり、メモリ)に読み込んでから、それらのオブジェクトを使用してエンティティの処理を並列化する必要があります。そうでない場合は、基本的に、必要なときにファイルを再読み込みしないようにハードドライブのキャッシュに依存しており、ハードドライブのキャッシュはメモリよりもはるかに小さい(1000倍)。

  • 次に、12.000アイテムでParallel.Forを実行しないでください。Parallel.Forは実際に12.000スレッドを作成しますが、これは実際には10スレッドよりも悪いです。これは、並列化によってオーバーヘッドが大きくなるためです。また、CPUはそれ以上実行できないため、CPUからのメリットはまったくありません。一度に10スレッド。

おそらく、より効率的な方法であるIEnumerable<T>.AsParallel()拡張機能(.net 4.0に付属)を使用する必要があります。これは、実行時に、実行するのに最適なスレッド番号を決定し、列挙可能なものを同じ数のバッチに分割します。基本的に、それはあなたのために仕事をします-しかしそれはまた大きなオーバーヘッドを生み出すので、1つの要素の処理が実際にCPUにとってコストがかかる場合にのみ役立ちます。

私の経験から、並列を使用することは、実際には使用しないことに対して、つまり実際にアプリケーションをプロファイリングすることによって、常に評価する必要があります。それがうまくいくと思い込まないでください。

于 2012-11-27T17:09:37.847 に答える