1

何千ものオブジェクトのリストがあり、1 ~ 3 分かかる操作が実行されます。もちろん PLINQ を使用していますが、入力リストの最後に近づくと、パーティション分割が事前に決定されていたかのように、1 つのコアしか機能していないことに気付きました。

では、IList を使用して、処理する項目がある限り、PLINQ にワーカー スレッドを強制的に使用させ続ける最善の方法は何でしょうか? コンピューターには、利用可能なハードウェア コアが多数あります。

参考文献:

4

1 に答える 1

2

私が理解していることから、PLINQ は、ソース シーケンスが であるかどうかに応じて、範囲またはチャンク パーティショニングを選択しますIList。の場合IList、境界は既知であり、インデックスによって要素にアクセスできるため、PLINQ は範囲パーティション分割を選択して、リストをスレッド間で均等に分割します。たとえば、リストに 1000 個のアイテムがあり、4 つのスレッドを使用する場合、各スレッドは 250 個のアイテムを処理する必要があります。一方、ソース シーケンスが ではない場合IList、PLINQ は範囲がどうなるかわからないため、範囲分割を使用できません。そのため、代わりにチャンク パーティショニングを使用します。

あなたの場合、があり、チャンクのパーティション分割を強制したい場合は、次のように書く代わりにIList、単純な : のように見せることができます:IEnumerable

list.AsParallel()...

それを書いてください:

list.Select(x => x).AsParallel()...

ダミー プロジェクションは、ソースが実際には であるという事実を隠すため、IListPLINQ はチャンク パーティション分割を使用します。

于 2011-10-31T02:58:37.893 に答える