如何将许多变量和函数从全局环境导出到foreach循环?

时间:2017-08-19 03:41:16

标签: r foreach parallel-processing global-variables doparallel

如何在foreach中为每个并行模拟的开头导出全局环境?以下代码是调用以运行模拟的函数的一部分。

  num.cores <- detectCores()-1
  cluztrr <- makeCluster(num.cores)
  registerDoParallel(cl = cluztrr)

  sim.result.list <- foreach(r = 1:simulations, 
      .combine = list,
      .multicombine = TRUE, 
      ) %dopar% {

          #...tons of calculations using many variables...

          list(vals1,
               vals2,
               vals3)
  }
 stopCluster(cluztrr)

是否有必要使用带有每个变量的字符向量的.export和我使用的函数?执行时间会慢吗?

2 个答案:

答案 0 :(得分:7)

如果foreach循环位于全局环境中,则应自动导出变量。如果没有,您可以使用.export = ls(globalenv())(或.GlobalEnv)。

对于其他包中的函数,您只需使用语法package::function

答案 1 :(得分:5)

全球环境中的[...],......”F. Privé reply的一部分在这里非常重要。 foreach框架只会识别该情况下的全局变量。如果foreach()调用是在函数内完成的,那么会这样做。

但是,如果您使用doFuture后端(免责声明:我是作者);

library("doFuture")
registerDoFuture()
plan(cluster, workers = cl)

所需的全局变量将被自动识别和导出(然后由future框架而不是foreach框架完成)。现在,如果您依赖于此,并且未明确指定.export,那么您的代码将仅适用于doFuture而不适用于其他后端。这是您作为开发人员需要做出的决定。

另外,全局变量的自动导出很简单,但要注意你知道导出了多少;导出太多太大的对象可能会非常昂贵,并且会在并行代码中引入大量开销。