Последовательное разделение нагрузки в параллельном цикле - PullRequest
3 голосов
/ 20 февраля 2012

У меня есть миллион элементов в Списке для обработки.
Если грубо сбросить их в Parallel.ForEach , это просто приведет к насыщению ЦП.
Вместо этого я делю главные списки элементов на части иперетащите подсписки в параллельный цикл.

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   
}    

Каков наилучший способ ожидания завершения всех параллельных итераций перед продолжением следующей итерации верхнего цикла?

Редактировать:
, как говорилось в некоторых ответах, «насыщать процессор» не является точным выражением.
На самом деле я просто хочу ограничить использование процессора и избежать чрезмерной нагрузки на него из-за этой обработки.

Ответы [ 2 ]

4 голосов
/ 20 февраля 2012

Parallel.ForEach не будет насыщать процессор; он использует некоторый интеллект для определения количества параллельных потоков для одновременной работы, максимум до 63.

См .: Ограничивает ли Parallel.ForEach количество активных потоков?

Вы также можете установить максимальную степень параллелизма, если хотите, указав ParallelOptions как new ParallelOptions { MaxDegreeOfParallelism = 5 } в качестве второго аргумента Parallel.ForEach.

В качестве последней точки, Parallel.ForEach блокируется, пока все итерации не будут завершены. Так что ваш код, как написано, работает. Вам не нужно ждать завершения итераций.

2 голосов
/ 20 февраля 2012

Что вы подразумеваете под "насыщением процессора"

Вы все еще можете регулировать цикл Параллельный foreach, предоставляя ему ParallelOptions Одним из свойств которого является MaxDegreesOfParallelism

Это позволит вам вернуться к вашей отдельной коллекции, например,

Parallel.ForEach(
     collection,
     new ParallelOptions { MaxDegreeOfParallelism = 5},
     E => { DoStuff(E) }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...