2013-04-25 3 views
4

PLINQ를 사용하여 작업을 데이터 병렬 처리하고 있습니다. 각 스레드는 알고리즘 설정에 따라 가변적 인 매우 많은 메모리를 소비하므로 알고리즘 옵션에 따라 필요한 메모리 양을 미리 계산할 수있는 쉬운 방법이 없습니다. 메모리 요구 사항이 낮을 때 최적의 스레드 수는 총 시스템 수가 8 개 중 7 개입니다. 메모리 요구 사항이 높을 때 2 스레드가 1보다 큰 개선이지만 3 스레드가 사용되면 시스템이 페이징 파일에 도달하기 시작하여 CPU 사용률이 0으로 떨어지고 성능이 수백 배 저하됩니다.PLINQ를 사용하여 스레드 수에 대한 메모리 사용 제약 조건

내가 할 수있는 일은 PLINQ가 메모리로드를 모니터링하는 동안 점진적으로 스레드 수를 늘리고 시스템이 사용 가능한 실제 메모리를 소모하면 마지막 스레드에서 취소 토큰을 설정할 수 있도록하는 것입니다. 다른 스레드가 최적으로 실행할 수 있도록 메모리를 롤백합니다.

PLINQ에서이 동작을 얻는 방법에 대한 아이디어 나 완전히 롤 - 마이 - 소유해야합니까? 앱의 현재의 메모리 사용량에 따라 스레드의 수를 제어 할 ThreadPool.SetMaxThreads(#N, #Q)를 사용할 수 있도록

+1

내가 아는 한, PLINQ는 앞쪽에있는 스레드의 수를 결정하고 질문을 실행하기 위해 일정하게 유지됩니다. 그것에 대해 아무 것도 할 수 없습니다 ('WithDegreeOfParallelism()'을 호출하여 상수를 변경하는 것을 제외하고). 'Parallel.ForEach()'를 대신 사용한다면 커스텀'TaskScheduler'를 사용하는 것이 더 좋은 기회 일 것입니다. – svick

답변

1

PLINQ (기본값 TaskSchedulerTaskFactory와) TreadPool 스레드를 사용합니다.

하지만 그 정도의 메모리 소비는 응용 프로그램 일 수 있습니다. 데이터베이스 (예 : 라이트 RDBMS 또는 NoSQL 하나 또는 캐싱 시스템)와 같은 다른 모듈로 다시 디자인해야하며 푸시해야합니다.