私はPLINQを使ってデータ処理を行っています。なぜ私のParallel.ForAll呼び出しは1つのスレッドを使用して終了するのですか?
基本的に私はtimeSeries
という名前のリストに在庫している約4000の時系列(基本的にDictionary<DataTime,T>
)を持っています。私の操作を実行するには
、私は単純に実行します。
timeSeries.AsParallel().ForAll(x=>myOperation(x))
私は私の異なるコアで何が起こっているのかを見てみると、私は最初に、すべての私のCPUが使用されていることに気づくと、私が上で見ますコンソール(いくつかのログを出力します)では、複数の時系列が同時に処理されます。
しかし、プロセスは時間がかかり、約45分後には、ログにはスレッドが1つしかないことが明白に示されます。何故ですか?
timeSeries
には、myOperation
の処理の簡単なインスタンスがリストの先頭と最後に含まれていることがわかりました。だから、もしPLINQが使っていたアルゴリズムが、4000個のインスタンスを4つのコアに分割し、それぞれに1000個を渡しているのかどうか疑問に思っていました。そして、コアがその作業の割り当てで終了すると、これは、コアの1つが非常に重い作業負荷に直面している可能性があることを意味します。
私の理論は正しいのでしょうか、別の考えられる説明がありますか?
実行前にリストをシャッフルするか、その問題を解決するために使用できる並列処理パラメータがありますか?
私が知る限り、仕事の窃盗はPLINQの反復ではなく、仕事で働いています。タスクがコレクションからアイテムの束を取得して処理する場合、他のタスクはそれらを盗むことができません。 – svick
また、カスタムパーティショナーはここでは必要ないかもしれません[フレームワークによって提供されるもの](http://msdn.microsoft.com/en-us/library/system.collections.concurrent.partitioner.create.aspx )十分かもしれません。 – svick
@svick - あなたはおそらく正しいでしょうが、それはfor-loopを指していて、たくさんのタスクを作成していますか?扱いにくいですね。 –