何千ものオブジェクトのリストがあり、1 ~ 3 分かかる操作が実行されます。もちろん PLINQ を使用していますが、入力リストの最後に近づくと、パーティション分割が事前に決定されていたかのように、1 つのコアしか機能していないことに気付きました。
では、IList を使用して、処理する項目がある限り、PLINQ にワーカー スレッドを強制的に使用させ続ける最善の方法は何でしょうか? コンピューターには、利用可能なハードウェア コアが多数あります。
参考文献:
何千ものオブジェクトのリストがあり、1 ~ 3 分かかる操作が実行されます。もちろん PLINQ を使用していますが、入力リストの最後に近づくと、パーティション分割が事前に決定されていたかのように、1 つのコアしか機能していないことに気付きました。
では、IList を使用して、処理する項目がある限り、PLINQ にワーカー スレッドを強制的に使用させ続ける最善の方法は何でしょうか? コンピューターには、利用可能なハードウェア コアが多数あります。
参考文献:
私が理解していることから、PLINQ は、ソース シーケンスが であるかどうかに応じて、範囲またはチャンク パーティショニングを選択しますIList
。の場合IList
、境界は既知であり、インデックスによって要素にアクセスできるため、PLINQ は範囲パーティション分割を選択して、リストをスレッド間で均等に分割します。たとえば、リストに 1000 個のアイテムがあり、4 つのスレッドを使用する場合、各スレッドは 250 個のアイテムを処理する必要があります。一方、ソース シーケンスが ではない場合IList
、PLINQ は範囲がどうなるかわからないため、範囲分割を使用できません。そのため、代わりにチャンク パーティショニングを使用します。
あなたの場合、があり、チャンクのパーティション分割を強制したい場合は、次のように書く代わりにIList
、単純な : のように見せることができます:IEnumerable
list.AsParallel()...
それを書いてください:
list.Select(x => x).AsParallel()...
ダミー プロジェクションは、ソースが実際には であるという事実を隠すため、IList
PLINQ はチャンク パーティション分割を使用します。