按顺序在Parallel.Foreach循环中分割负载

我在List中要处理一百万个元素。
粗暴地将它们拖放到Parallel.ForEach中会使CPU饱和。
相反,我将元素主表分成几部分,并将子列表放入并行循环中。

List<Element> MasterList = new List<Element>();
Populate(MasterList); // puts a Million elements into list;

//Split Master List into 100 Lists of 10.0000 elements each
List<List<Element>> ListOfSubLists = Split(MasterList,100);

foreach (List<Element> EL in ListOfSubLists )
{
   Parallel.ForEach(EL, E =>
   {
     // Do Stuff
   }

  //wait for all parallel iterations to end before continuing   
}    

在继续下一次循环迭代之前等待所有并行迭代结束的最佳方法是什么?

编辑:
正如一些答案所述,“饱和CPU”并不是一个准确的表达。
其实我只是想限制CPU使用率,并避免来自这个处理的过度负载。


Parallel.ForEach不会使CPU饱和; 它使用一些智能来决定同时运行多少个并行线程,最大值为63。

请参阅:Parallel.ForEach是否限制活动线程的数量?

如果需要,还可以通过提供ParallelOptionsnew ParallelOptions { MaxDegreeOfParallelism = 5 }的第二个参数new ParallelOptions { MaxDegreeOfParallelism = 5 }作为new ParallelOptions { MaxDegreeOfParallelism = 5 }来设置最大Parallel.ForEach

作为最后一点, Parallel.ForEach阻塞,直到所有迭代完成。 所以你的代码,正如所写,起作用。 您不需要等待迭代完成。


你是什​​么意思“饱和CPU”

您仍然可以通过为ParallelOptions提供并行foreach循环来MaxDegreesOfParallelism它,其中一个属性是MaxDegreesOfParallelism

这将允许你回到你的单一集合,例如

Parallel.ForEach(
     collection,
     new ParallelOptions { MaxDegreeOfParallelism = 5},
     E => { DoStuff(E) }
);
链接地址: http://www.djcxy.com/p/50161.html

上一篇: Sequentially Splitting the load on a Parallel.Foreach Loop

下一篇: C# Parallel.Foreach that is not peforming action on all items in list