2014-05-18 4 views
0

길이가 다른 병렬화 작업에는 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"메시지가 없어도 병렬 처리로 마스터 노드에 "인쇄"할 수 있습니까? :)

      고마워요! 마크

  • +0

    'foreach' 루프가 어떻게 작동하는지 이해하지 못했습니다. 그것은 for 루프가 아닙니다. 'foreach' 패키지 비 네트를 읽고 결과를 하나의 객체로 결합하는 법을 배우십시오 (예 : 루프에서 'append'를 사용하여 객체를 키우는 것은 R의 추기경의 죄악 중 하나입니다). AFAIK, 당신은'foreach'와 병렬로 완전히 독립적 인 (난처하게 평행 한) 작업 만 할 수 있습니다. – Roland

    +0

    @Roland 다음과 같이 생각했습니다. "main"프로그램이 작업자 스레드를 생성합니다. 그 중 1 개가 끝나면 메인 프로그램은 결과를 가져오고, 약간의 후 처리 (콘솔에 진행 상황, 전역 변수 조작하기 등)를 작성하고 새로운 후 처리를 생성합니다. 나는 매우 드문 유스 케이스라고 생각하지 않는다. 나는 이미 첫 번째 n 개의 쓰레드가 다른 쓰레드에 대한 정보를 가지고 있지 않다는 것을 알고 있었다. 왜냐하면 새로운 쓰레드가 생성되기 때문에 실행 중이기 때문이다. 제 경우에는 새로운 프로세스가 생성 될 때 모든 데이터를 사용하는 것으로 충분할 것입니다. – Marc

    답변

    0

    나쁘다. 조금도.

    % dopa % 의 foreach는 부하 분산이이라고 생각했습니다. 이 경우는이 아니며 병렬 처리 중에 호스트 측에서 아무 것도 수행 할 수 없기 때문에 제 질문은 더 이상 사용되지 않습니다. 이것이 글로벌 변수가 클라이언트 측에서만 조작되고 호스트에 도달하지 않는 이유를 설명합니다.