2013-06-06 3 views
4

이유가 foreach()이고 %dopar%for보다 느립니다. 일부 저 작은 exmaple :foreach % dopar % for 루프보다 느림

library(parallel) 
library(foreach) 
library(doParallel) 
registerDoParallel(cores = detectCores()) 

I <- 10^3L 

for.loop <- function(I) { 
    out <- double(I) 
    for (i in seq_len(I)) 
    out[i] <- sqrt(i) 
    out 
} 

foreach.do <- function(I) { 
    out <- foreach(i = seq_len(I), .combine=c) %do% 
    sqrt(i) 
    out 
} 

foreach.dopar <- function(I) { 
    out <- foreach(i = seq_len(I), .combine=c) %dopar% 
    sqrt(i) 
    out 
} 

identical(for.loop(I), foreach.do(I), foreach.dopar(I)) 
## [1] TRUE 
library(rbenchmark) 
benchmark(for.loop(I), foreach.do(I), foreach.dopar(I)) 
##    test replications elapsed relative user.self sys.self user.child sys.child 
## 1  for.loop(I)   100 0.696 1.000  0.690 0.000  0.0  0.000 
## 2 foreach.do(I)   100 121.096 173.989 119.463 0.056  0.0  0.000 
## 3 foreach.dopar(I)   100 120.297 172.841 111.214 6.400  3.5  6.734 

일부 추가 정보 :

sessionInfo() 
## R version 3.0.0 (2013-04-03) 
## Platform: x86_64-unknown-linux-gnu (64-bit) 
## 
## locale: 
## [1] LC_CTYPE=ru_RU.UTF-8  LC_NUMERIC=C    LC_TIME=ru_RU.UTF-8  
## [4] LC_COLLATE=ru_RU.UTF-8  LC_MONETARY=ru_RU.UTF-8 LC_MESSAGES=ru_RU.UTF-8 
## [7] LC_PAPER=C     LC_NAME=C     LC_ADDRESS=C    
## [10] LC_TELEPHONE=C    LC_MEASUREMENT=ru_RU.UTF-8 LC_IDENTIFICATION=C  
## 
## attached base packages: 
## [1] parallel stats  graphics grDevices utils  datasets methods base  
## 
## other attached packages: 
## [1] doMC_1.3.0  rbenchmark_1.0.0 doParallel_1.0.1 iterators_1.0.6 foreach_1.4.0 plyr_1.8   
## 
## loaded via a namespace (and not attached): 
## [1] codetools_0.2-8 compiler_3.0.0 tools_3.0.0 

getDoParWorkers() 
## [1] 4 
그것은 구체적으로 언급하고 있기 때문에 별도의에서 결과를 결합 할 필요없이, 실제로 때때로이 설정 느리다 예제와 함께 설명되어
+7

작은 작업의 경우 특히 단일 스레드의 벡터화 된 기능과 비교하여 스레드 설정에 따른 오버 헤드가 우세합니다. 위의 구현에서 많은 함수 호출과 메모리 오버 헤드가 발생합니다. 병렬 처리는 CPU 사용량이 많은 집중적 인 작업에서 가장 잘 작동합니다. – James

답변

5

패키지의 병렬 프로세스 doParallel.

참조 : http://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf

페이지 3 : 작은 태스크

, 결과적으로 작업을 스케줄링 결과 작업 자체를 실행하는 시간보다 더 클 수있다 복귀의 오버 헤드 열악한 성능.

어떤 경우에는 패키지를 사용하면 코드를 실행하는 데 필요한 시간이 50 %가된다는 것을 알기 위해 예제를 사용했습니다.

관련 문제