如何将多个变量和函数从全局环境导出到 foreach 循环?
How to export many variables and functions from global environment to foreach loop?
如何导出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 与我使用的 每个 变量和函数的字符向量一起使用?执行时间会很慢吗?
如果foreach循环在全局环境中,变量应该自动导出。如果没有,您可以使用 .export = ls(globalenv())
(或 .GlobalEnv
)。
对于其他包中的函数,您只需使用语法 package::function
.
的 "If [...] in the global environment, ..." 部分在这里非常重要。在这种情况下,foreach 框架只会识别全局变量。如果 foreach()
调用是在函数内完成的,它将 不会 这样做。
但是,如果您使用 doFuture 后端(免责声明:我是作者);
library("doFuture")
registerDoFuture()
plan(cluster, workers = cl)
需要的全局变量将被自动识别和导出(然后由future框架而不是foreach框架完成)。现在,如果您依赖于此,并且没有明确指定 .export
,那么您的代码将仅适用于其他后端的 doFuture
和 none。这是您作为开发人员需要做出的决定。
此外,全局变量的自动导出很简洁,但要注意你知道导出了多少;导出太多太大的对象可能会非常昂贵,并且会在并行代码中引入大量开销。
如何导出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 与我使用的 每个 变量和函数的字符向量一起使用?执行时间会很慢吗?
如果foreach循环在全局环境中,变量应该自动导出。如果没有,您可以使用 .export = ls(globalenv())
(或 .GlobalEnv
)。
对于其他包中的函数,您只需使用语法 package::function
.
foreach()
调用是在函数内完成的,它将 不会 这样做。
但是,如果您使用 doFuture 后端(免责声明:我是作者);
library("doFuture")
registerDoFuture()
plan(cluster, workers = cl)
需要的全局变量将被自动识别和导出(然后由future框架而不是foreach框架完成)。现在,如果您依赖于此,并且没有明确指定 .export
,那么您的代码将仅适用于其他后端的 doFuture
和 none。这是您作为开发人员需要做出的决定。
此外,全局变量的自动导出很简洁,但要注意你知道导出了多少;导出太多太大的对象可能会非常昂贵,并且会在并行代码中引入大量开销。