【问题标题】:Output of parallel computing in R on WindowsWindows 上 R 中并行计算的输出
【发布时间】:2020-02-03 13:33:05
【问题描述】:

我想在 Windows 上的 R 中做一些并行计算。

library(doSNOW)
library(foreach)
cl<-makeCluster(4)
registerDoSNOW(cl)

nn = seq(2,20, by=2)
nn2 = rep(-1,10)
vector.accessed.within.iteration = rep(0, 10)

y = foreach(i=1:10) %dopar% {

   print(paste0('i = ', i))
   nn2[i] = (nn[i])^2
   vector.accessed.within.iteration[i] = nn[i] + nn2[i]
   nn2[i]
} 

stopCluster(cl)

运行代码时,y 按预期返回为从 2 到 20 的正方形列表。但是,nn2vector.accessed.within.iteration 都不会在 foreach 循环内修改。此外,不会发生打印print(paste0('i = ', i))

是否可以在 Windows 上并行运行循环迭代,同时显示消息和修改全局环境中的变量?

【问题讨论】:

  • 这里已经多次回答了这两个问题。请仔细搜索。
  • @F.Privé 感谢您的评论。我进行了搜索,但我没有找到任何一个问题的答案。也许我没有使用正确的术语。
  • 看来你不能简单地修改foreach循环中的变量,你需要返回它们。
  • 顺便说一句,请参阅我的博客文章privefl.github.io/blog/a-guide-to-parallelism-in-r 以解决您的两个问题。

标签: r windows for-loop parallel-processing iteration


【解决方案1】:

是否可以在 Windows 上并行运行循环迭代,同时...从全局环境中修改变量?

否(*)。 foreach() %dopar% { ... } 构造中设置的所有值必须在每次迭代结束时返回。这是 foreach 包的设计和理念。有关如何返回多个值,请参阅 2019-01-11 的博文 'Parallelize a For-Loop by Rewriting it as an Lapply Call' 中的“示例 2:稍微复杂的 for 循环”(免责声明:我是作者)。

(*) 存在使用其他渠道进行通信的各种解决方法,例如文件系统。但是,只有在所有其他替代方案都已用尽且失败时,才应使用此类解决方案。我强烈推荐这样的替代解决方案,因为您遇到其他类型的问题。在你的情况下,你肯定不需要它。

是否可以在窗口上并行运行循环迭代,同时显示消息...?

是的,如果您使用doFuture foreach 适配器(免责声明:我是作者)。当您使用它时,您将可以访问所有 future 框架,其中包括输出、消息、警告和其他条件类型的中继。您可以在 2018 年 7 月 23 日的博文 'future 1.9.0 - Output from The Future' 中了解这一点(免责声明:我是作者)。

> library(doFuture)
> registerDoFuture()  ## tell foreach to use the future framework

> ## Create a local cluster of two local workers
> plan(multisession, workers = 2L)

> library(foreach)
> y <- foreach(x = 1:3) %dopar% {
    cat(paste0("x = ", x, "\n"))
    sqrt(x)
  }
x = 1
x = 2
x = 3
> 

【讨论】:

    猜你喜欢
    • 2011-07-26
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多