2012-02-20 5 views
3

처리 할 List에 백만 가지 요소가 있습니다.
Parallel.ForEach에 천천히 떨어 뜨리면 CPU가 포화됩니다.
대신 요소 마스터리스트를 조각으로 나누고 하위 목록을 병렬 루프에 놓습니다.Parallel.Foreach Loop에서 순차적으로로드 나누기

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 사용을 제한하고이 처리에서 오는 과도한 부하를 피하고자합니다.

답변

4

Parallel.ForEach은 CPU를 포화시키지 않습니다. 이 병렬 스레드의 최대와 동시에 실행하는 방법에 대해 많은 결정하는 몇 가지 정보를 사용하여 63

참조 : Does Parallel.ForEach limits the number of active threads?

원하는 경우도 ParallelOptionsnew ParallelOptions { MaxDegreeOfParallelism = 5 }처럼를 제공하여, 최대 병렬 처리 수준을 설정할 수 있습니다 두 번째 인수는 Parallel.ForEach입니다.

마지막으로 모든 반복이 완료 될 때까지 Parallel.ForEach이 차단됩니다. 따라서 작성된 코드가 작동합니다. 반복이 완료 될 때까지 기다릴 필요가 없습니다. 무슨 뜻 ParallelOptions 하나의 속성을 제공하여 당신은 여전히 ​​병렬 foreach 루프 스로틀 수

"CPU를 적신"무엇

+2

나는 동의한다. 10,000 개의 항목을 열거하는 Parallel.foreach는 백만보다 더 많거나 적은 쓰레드를 생성하지 않습니다. RAM이 귀하의 백만 가지 항목을 다루는 문제가된다면 BlockingCollection을 고려하십시오. - 이것은 한 번에 메모리에있는 항목의 수를 제한합니다. – Ragoczy

+0

고맙습니다. 마지막 문장에서, 나는 Parallel.ForEach가 블로킹하고 있다는 것을 몰랐다. 아주 잘 알고 있습니다. CPU 채도에 대해서는 편집을 참조하십시오. –

+0

@MikaJacobi 어떤 이유에서든 비 차단을 원한다면 새로운'Task'를 생성하여 스스로 차단해야합니다. –

2

은 당신이로 돌아갈 수있는 MaxDegreesOfParallelism

입니다 당신의 단일 컬렉션 예

Parallel.ForEach(
    collection, 
    new ParallelOptions { MaxDegreeOfParallelism = 5}, 
    E => { DoStuff(E) } 
); 
+0

고맙습니다. 매우 감사합니다. 나는 그 사실을 몰랐다. 편집을 참조하십시오. –