처리 할 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 사용을 제한하고이 처리에서 오는 과도한 부하를 피하고자합니다.
나는 동의한다. 10,000 개의 항목을 열거하는 Parallel.foreach는 백만보다 더 많거나 적은 쓰레드를 생성하지 않습니다. RAM이 귀하의 백만 가지 항목을 다루는 문제가된다면 BlockingCollection을 고려하십시오. - 이것은 한 번에 메모리에있는 항목의 수를 제한합니다. –
Ragoczy
고맙습니다. 마지막 문장에서, 나는 Parallel.ForEach가 블로킹하고 있다는 것을 몰랐다. 아주 잘 알고 있습니다. CPU 채도에 대해서는 편집을 참조하십시오. –
@MikaJacobi 어떤 이유에서든 비 차단을 원한다면 새로운'Task'를 생성하여 스스로 차단해야합니다. –