2016-07-12 2 views
0

DoMC를 사용하여 병렬 foreach 루프를 작성하려고하지만 이상한 행동이 진행되고 있습니다. 코드는이R for foreops for 루프를 포함하는 foreach

for (file in files) { 
do stuff 
for (extra in extras) { 
do some heavy stuff 
} 
} 
  • 나는 DoMC 또는 DoParallel로드, 루프가 하나 개의 코어를 사용하는 시작처럼 보이지만 두 번째 루프는 4 개 코어를 활용
  • 나는 루프 foreach는 할 %를 전환 할 때 정확히 똑같은 동작을합니다.
  • 외부 루프에 foreach를 사용하고 내부 루프를 for 루프로두면 스크립트가 느려집니다. 그것은 4jobs 병렬로 시작하고 그들은 모두 중지하고 점진적으로 CPU 사용이 감소합니다.

내가 원하는 것은 내부 루프가 아닌 상단 루프를 병렬 처리하는 것입니다. 누가 무슨 일이 일어날 지 알고 있니? 나는 과거에 foreach와 doMC를 사용 해본 적이 없으며 이전에는이 ​​문제가 없었습니다.

답변

1

그것은 당신이 몇 가지 일이 벌어 가지고있는 것처럼 보이지만 확실하게 여기 충분하지 :

당신이 사용하는 경우가 RStudio에서 잘 작동하지 않을 수 있습니다, 즉 doMC의 명시된 제한 사항입니다. R64 비트에서 바로 실행 해보십시오.

당신은 require(doMC) 또는 library(doMC) 전화 패키지에 필요하지만, 당신은 또한 당신의 컴퓨터에 등록 필요하거나 4 실행하는 데 얼마나 많은 코어를 말하고 바로

registerDoMC(4) 

그건 작동하지 않습니다. 당신이 아무것도 말하지 않는다면 당신의 코어의 1/2을 사용하려고 노력합니다.

그리고 당신은 위의 전체 코드가없는 적절한 형식은 다음과 같습니다

foreach(file in files) %dopar% { stuff to do }

당신은 명시 적 %dopar% 명령을 사용하여 병렬 처리를 수행하도록 지시해야합니다. 하나의 영역에 모든 코어를 사용하고 다른 코어에는 모든 코어를 사용하지 않으려면 기능 또는 코드의 개별 부분에 대해 몇 개의 코어가 있는지 알려주는 옵션을 설정해야합니다. 그러나 4를 사용하는 외부 루프와 2를 사용하는 내부 루프를 말하면 외부 루프에서 4로 설정하고 자체를 관리하게하는 것보다 느릴 수 있습니다. 나는 핸드 오프를 수행하는 방법, 실험을 100 % 명확하게 볼 수는 없습니다.

는 코어의 수를 변경하려면, 그냥이 줄을 추가 :

options(cores=2)

난이 도움이되기를 바랍니다!

+0

감사합니다. 감사합니다. 문제가 다르기 때문에 새로운 질문을 게시해야합니다. – Michael

+0

내부 계산과 변환이 많은 매우 큰 데이터 세트를 wrrking하는 경우 CPU가 작동하는 속도를 높이면 급격한 메모리 팽창이 발생할 가능성이 있습니다.'rm()'과'gc()'를 사용해보십시오. 프레임 또는 파일에 영구 메모리에 추가 된 후 임시 데이터를 지우는 것이 좋습니다. 메모리가 지워지면 새 멀티 코어 프로그램을 따라갈 수 있습니다. – sconfluentus