R中的%dopar%不能正常工作

时间:2017-08-08 16:12:06

标签: r foreach parallel-processing plyr

我刚开始使用foreach和%dopar%方法在R中进行并行处理,但我得到的结果令人困惑,与for循环不同;这是我用来测试那些方法的代码,以及我得到的结果:

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

提前致谢:)

1 个答案:

答案 0 :(得分:1)

请先阅读功能文档,然后再说它们不起作用。

foreach更像是lapply而不是for - 循环。

因此,例如,foreach(k=1:1000) %dopar% sqrt(k)提供与lapply(1:1000, sqrt)相同的结果。

然而,在使用foreach SEQUENTIALLY 时,您可以修改全局变量。然而,当使用并行性时,向量sdopar被复制到每个“簇”,以便您修改副本,而不是初始对象。

所以,你必须按照@ChiPak提到的方式选择.combine = c或之后使用do.call(sdopar, c)

PS:始终初始化迭代填充的向量(为了不生长向量的效率),例如:s_for <- double(1000)