2017-03-09 4 views
1

R foreach 루프가 doParallel 백엔드와로드 균형 조정을 수행하는 방법을 수정할 수 있습니까? 실행 시간이 매우 다른 작업을 병렬 처리 할 때 모든 노드에서 발생할 수 있지만 하나는 작업을 마친 반면 마지막 노드는 여러 가지 작업을 수행해야합니다. 다음은 장난감 예입니다.foreach 루프에서로드 밸런싱

library(foreach) 
library(doParallel) 

registerDoParallel(4) 

waittime = c(10,1,1,1,10,1,1,1,10,1,1,1,10,1,1,1) 

w = iter(waittime) 

foreach(i=w) %dopar% { 
    message(paste("waiting",i, "on",Sys.getpid())) 
    Sys.sleep(i) 
} 

기본적으로 코드 레지스터 4 코어입니다. 각 루프 i에 대해 waittime[i] 초를 기다리는 작업입니다. 그러나 foreach 루프의로드 균형 조정은 기본적으로 총 작업 수를 등록 된 코어 수의 집합으로 분할하기 때문에 위의 예에서 첫 번째 코어는 waittime으로 모든 작업을 수신합니다 = 10 인 반면 나머지 3 명은 waittime = 1로 작업을 수신하므로 첫 번째 작업이 완료되기 전에 이러한 3 개의 코어가 모두 완료됩니다.

foreach() 개의 작업을 한 번에 하나씩 배포 할 수있는 방법이 있습니까? 즉 위의 경우 처음 4 개의 작업이 4 개의 코어에 분산되어 있고 다음 작업이 다음 사용 가능한 코어로 분산되어 있어야합니다.

감사합니다.

답변

3

나는 자신을 시험하지 않았다, 그러나 doParallel 백엔드 mclapply()에서 mc.preschedule 인수와 유사한 preschedule 옵션을 제공합니다. 합니다 (doParallel vignette의 7 항 참조).

당신은 시도 할 수 있습니다 :

mcoptions <- list(preschedule = FALSE) 
foreach(i = w, .options.multicore = mcoptions) 
+0

예. 그게 다야. 고마워. – xraynaud

0

사과로 답변을 게시했지만 의견이 불충분 한 담당자가 있습니다. parLapplyLB 또는 parSapplyLB를 사용하도록 코드를 다시 작성할 수 있습니까?

parLapplyLB, parSapplyLB 시간이 매우 가변 량을 얻어 X의 다른 요소 FUN을 적용 할 때 사용하기위한로드 밸런싱 버전, 그리고 기능 중 하나는 결정적이거나 재현 가능한 결과는 필요하지 않다.

+0

가능하다면, 나는 확실히 wihth foreach는 체류 원합니다. 내 응용 프로그램에서는 foreach 루프 내부에있는 코드가 내 예제에서 사용한 두 명령보다 훨씬 복잡하기 때문에 코드를 단일 함수로 변환하면 복잡 할 수 있습니다. 어쨌든 고마워. – xraynaud

+0

매우 제한된 예제를 작성한 것 같았습니다. forLop 내부에 parLapply를 사용하는 함수 형태로 코드를 작성하는 것이 쉬운 일은 아닙니다. – Lespied