2012-09-02 117 views
5

我尝试(使用snow::parLapply)一些代码依赖于一个包并行(即比snow其他包)。由parLapply调用该函数引用的对象必须明确地传递给使用clusterExport集群。有没有办法通过整个包到集群,而不是明确地命名每个函数(包括软件包的用户函数调用!内部函数)在clusterExport传递整个包雪集群

回答

6

所有节点上安装的软件包,并有所有节点上的代码调用library(thePackageYouUse)通过一个可用的命令,鸡蛋像

clusterApply(cl, library(thePackageYouUse)) 

我觉得parallel包附带R最近的版本有例子 - - 例如,从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 
}) 
+1

谢谢德克。有没有什么原因为什么做'clusterExport(ls())'会危险?这不会从包传递函数帮助,但它会节省很多头痛的快速并行for循环(别人的,不是我的!),它依靠一吨的全局变量。 – Michael

+0

这只是糟糕的设计,因为它使用scattershot plus厨房水槽方法。在串行解决方案中设计你需要的东西,然后使其平行。 –

+0

够公平的,谢谢你的帮助。 – Michael