【发布时间】:2012-09-02 01:00:02
【问题描述】:
我正在尝试并行化(使用snow::parLapply)一些依赖于包(即snow 之外的包)的代码。在parLapply 调用的函数中引用的对象必须使用clusterExport 显式传递给集群。有没有办法将整个包传递给集群,而不必在clusterExport 中显式命名每个函数(包括用户函数调用的包的内部函数!)?
【问题讨论】:
标签: r parallel-processing scope
我正在尝试并行化(使用snow::parLapply)一些依赖于包(即snow 之外的包)的代码。在parLapply 调用的函数中引用的对象必须使用clusterExport 显式传递给集群。有没有办法将整个包传递给集群,而不必在clusterExport 中显式命名每个函数(包括用户函数调用的包的内部函数!)?
【问题讨论】:
标签: r parallel-processing scope
在所有节点上安装包,并通过可用命令之一在所有节点上调用library(thePackageYouUse) 代码,例如
clusterApply(cl, library(thePackageYouUse))
我认为最近的 R 版本附带的 parallel 包有示例 - 例如,请参见此处来自 help(clusterApply) 的 boot 包被加载到任何地方:
## A bootstrapping example, which can be done in many ways:
clusterEvalQ(cl, {
## set up each worker. Could also use clusterExport()
library(boot)
cd4.rg <- function(data, mle) MASS::mvrnorm(nrow(data), mle$m, mle$v)
cd4.mle <- list(m = colMeans(cd4), v = var(cd4))
NULL
})
【讨论】:
clusterExport(ls()) 会很危险吗?这无助于从包中传递函数,但快速并行化依赖大量全局变量的 for 循环(其他人,不是我的!)会省去很多麻烦。
clusterApply) 应该是:clusterCall(cl, function() library(thePackageYouUse))