2017-08-08 41 views
-1

我剛開始在R中使用foreach和%dopar%methodes進行並行處理,但是我得到的結果令人困惑,並且與for循環不一樣;這裏是我用來測試那些methodes和resultes我得到的代碼:%R中的dopar%無法正常工作

library(plyr); library(doParallel); library(foreach) 

cs <- makeCluster(2) 
registerDoParallel(cs) 

sfor_start <- Sys.time() 
s_for=as.numeric() 
for (i in 1:1000) { 
    s_for[i] = sqrt(i) 
} 
print(Sys.time() - sfor_start) 

sdopar_start <- Sys.time() 
sdopar=as.numeric() 
foreach(k=1:1000) %dopar% { 
    sdopar[k] = sqrt(k) 
} 
print(Sys.time() - sdopar_start) 

而這裏的結果:提前:)

> s_for[1:10]; sdopar[1:10] 
[1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427 3.000000 3.162278 
[1] NA NA NA NA NA NA NA NA NA NA 

感謝

+0

你可以試試'sdopar < - foreach(k = 1:1000)%dopar%{sqrt(k)}'? – CPak

+0

適用於.combine = c,謝謝 –

回答

1

請閱讀的文檔在表明他們不工作之前先行使職能。

foreach作品更像是lapply而不是for -loop。

因此,例如,foreach(k=1:1000) %dopar% sqrt(k)給出了與lapply(1:1000, sqrt)相同的結果。

但是,確實可以在使用foreachSEQUENTIALLY修改全局變量。然而,在使用並行性時,矢量sdopar被複制到每個「集羣」,以便修改副本,而不是最初的對象。

因此,您必須按照@ChiPak所提及的方式進行操作,選項.combine = c或之後使用do.call(sdopar, c)。 PS:始終初始化你迭代填充的矢量(爲了不增長矢量的效率),例如像這樣:s_for <- double(1000)

+0

關於'.combine'的好處。 – CPak