2016-07-21 4 views
0

저는 R을 처음 접했고 최근에는 특정 값을 가진 목록의 요소 색인을 찾아야했습니다. 나는 foreach를 사용하여 작업 속도를 높이려고했으며 또한이 작업을 수행하는 두 가지 방법을 비교했습니다.간단한 예 예 :

library("iterators") 
library("foreach") 
library("doParallel") 
a <- 1:200000 
b <- sample(1:200000,100000,replace=TRUE) 
registerDoParallel() 
getDoParWorkers(); #to see the number of cores 
system.time(unlist(lapply(b,function(x) which(a==x)))) 
system.time(foreach(i<-iter(b),.combine='c') %dopar% { which(a==b) }) 

출력 : 내가 궁금하네요

Loading required package: parallel 
[1] 32 
    user system elapsed 
124.648 7.460 132.114 
    user system elapsed 
402.076 59.164 55.260 

: 1 아래의 코드에서 'A'는리스트와 B는 그 인덱스 우리는 'A'에서 검색 할 값은 다음과) naively, 왜이 작업이 느린가요? 체크하지는 않았지만 스크립팅 언어가 똑같은 일을 훨씬 빠르게 할 수 있다고 생각합니다. 2) 작업이 병렬로 잘 수행되면 안됩니다. 32 개 코어를 사용할 수 있으므로 예상보다 오래 걸리는 것 같습니다. 3) 실제로 행렬의 행 즉, foreach (i =-iter (b, by = 'row'), combine = 'c') % dopar % {#stuff}를 반복합니다. 내 이해는이 방법은 각 행렬에 전체 행렬을 전송하지 않기 때문에 가장 좋습니다. 각 코어가받는 데이터를 확인하여 확인하는 방법이 있습니까?

+0

저는 전문가가 아니기 때문에 잘못 될 수 있습니다. : 일반적으로 컴파일 된 언어는 해석 된 언어보다 빠릅니다 (사실 컴퓨터 언어로 실행 파일을 컴파일하면 스크립트 언어 매번 해석되어야하므로 시간이 낭비됩니다). 그렇다면 R의 벡터화는 다른 언어보다 느리지 만 유용합니다 ...하지만 겸손한 의견 (저는 R도 상당히 익숙합니다)에서 컴파일 된 비 벡터화 된 언어보다 R로 쓰는 시간이 훨씬 적습니다.) – Eugen

답변

0

1e5 * 2e5 비교를 수행합니다. 이것이 약간의 시간이 걸리는 것은 놀라운 일이 아닙니다.

각 개별 which(a==x)은 그리 느리지 않고 작업자에게 각 반복을 개별적으로 보내는 경우 많은 병렬 처리 오버 헤드가 발생합니다. iterations의 낱단을 보내는 것이 훨씬 낫다.

3에 대해서는
a <- 1:20000 
b <- sample(1:20000,10000,replace=TRUE) 

library(parallel) 
system.time(res1 <- unlist(lapply(b,function(x) which(a==x)))) 
# user  system  elapsed 
#0.597  0.178  0.789 
system.time(res2 <- unlist(mclapply(b,function(x) which(a==x), 
            mc.preschedule = TRUE, mc.cores = 3))) 
# user  system  elapsed 
#0.004  0.022  0.325 
all.equal(res1, res2) 
#[1] TRUE 

) : 병렬보다 더 나은 방법 (가장 좋은 것입니다 행렬 대수)가있을 수 있습니다, 그러나 당신의 #stuff에 따라 비 Windows 시스템에서 당신은 mclapply에 그냥 할 수 있습니다.

+0

감사합니다, 병렬화 오버 헤드는 내가 생각하는 데 익숙해지는 것입니다. – nak3c