2017-08-08 42 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