【问题标题】:%dopar% in R does not work properlyR 中的 %dopar% 无法正常工作
【发布时间】:2018-01-16 07:33:28
【问题描述】:

我刚开始在 R 中使用 foreach 和 %dopar% 方法进行并行处理,但是我得到的结果令人困惑,并且与 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

提前谢谢:)

【问题讨论】:

  • 你能试试sdopar &lt;- foreach(k=1:1000) %dopar% { sqrt(k) }吗?
  • 与 .combine=c 配合使用,谢谢

标签: r foreach parallel-processing plyr


【解决方案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 &lt;- double(1000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2017-01-12
    • 1970-01-01
    • 2020-06-30
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多