如何在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和我使用的函数?执行时间会慢吗?
答案 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
而不适用于其他后端。这是您作为开发人员需要做出的决定。
另外,全局变量的自动导出很简单,但要注意你知道导出了多少;导出太多太大的对象可能会非常昂贵,并且会在并行代码中引入大量开销。