길이가 다른 병렬화 작업에는 doSNOW- 패키지가 사용됩니다. 하나 개의 스레드가 완료되면, 나는 ( 그것은 singlethreaded에서 작동 스레드 간 정보 전달 (foreach % dopar %)
(clusterApplyLB처럼 평형화) immediatly 다음 스레드를 시작
- 다음 스레드에 전달 된 스레드에 의해 생성 된 일부 정보를 원하는 makeClust 볼 (사양 = 1))
#Register Snow and doSNOW require(doSNOW) #CHANGE spec to 4 or more, to see what my problem is registerDoSNOW(cl <- makeCluster(spec=1,type="SOCK",outfile="")) numbersProcessed <- c() # init processed vector x <- foreach(i = 1:10,.export=numbersProcessed) %dopar% { #Do working stuff cat(format(Sys.time(), "%X"),": ","Starting",i,"(Numbers processed so far:",numbersProcessed, ")\n") Sys.sleep(time=i) #Appends this number to general vector numbersProcessed <- append(numbersProcessed,i) cat(format(Sys.time(), "%X"),": ","Ending",i,"\n") cat("--------------------\n") } #End it all stopCluster(cl)
지금 아웃 4. "makeCluster"의 사양을 변경할 put은 다음과 같습니다.
[..] Type: EXEC 18:12:21 : Starting 9 (Numbers processed so far: 1 5) 18:12:23 : Ending 6 -------------------- Type: EXEC 18:12:23 : Starting 10 (Numbers processed so far: 2 6) 18:12:25 : Ending 7
18:12:21 스레드 9가 알기 때문에 스레드 1과 5가 처리되었습니다. 2 초 후 스레드 6가 종료됩니다. 다음 스레드는 최소한 약 1, 5 및 6을 알아야합니다. 그러나 스레드 10은 약 6과 2만을 알고 있습니다.
깨달았습니다. 이것은 makeCluster에 지정된 코어와 관련이 있습니다. 9는 약 1, 5 및 9 (1 + 4 + 4)를 알고, 10은 약 2,6 및 10 (2 + 4 + 4)을 압니다.
더 많은 세대의 스레드에 "처리 된"자료를 전달하는 더 좋은 방법이 있습니까?
Bonuspoints : 스노우 패키지의 "Type : EXEC"메시지가 없어도 병렬 처리로 마스터 노드에 "인쇄"할 수 있습니까? :)
고마워요! 마크
'foreach' 루프가 어떻게 작동하는지 이해하지 못했습니다. 그것은 for 루프가 아닙니다. 'foreach' 패키지 비 네트를 읽고 결과를 하나의 객체로 결합하는 법을 배우십시오 (예 : 루프에서 'append'를 사용하여 객체를 키우는 것은 R의 추기경의 죄악 중 하나입니다). AFAIK, 당신은'foreach'와 병렬로 완전히 독립적 인 (난처하게 평행 한) 작업 만 할 수 있습니다. – Roland
@Roland 다음과 같이 생각했습니다. "main"프로그램이 작업자 스레드를 생성합니다. 그 중 1 개가 끝나면 메인 프로그램은 결과를 가져오고, 약간의 후 처리 (콘솔에 진행 상황, 전역 변수 조작하기 등)를 작성하고 새로운 후 처리를 생성합니다. 나는 매우 드문 유스 케이스라고 생각하지 않는다. 나는 이미 첫 번째 n 개의 쓰레드가 다른 쓰레드에 대한 정보를 가지고 있지 않다는 것을 알고 있었다. 왜냐하면 새로운 쓰레드가 생성되기 때문에 실행 중이기 때문이다. 제 경우에는 새로운 프로세스가 생성 될 때 모든 데이터를 사용하는 것으로 충분할 것입니다. – Marc