使用plyr和doMC并行化的R代码:错误消息:do.ply(i)中的错误:任务1失败 - “找不到函数”getClass“”

时间:2013-02-01 00:35:55

标签: r parallel-processing cluster-computing

我刚刚开始学习如何使用远程超级计算机来执行并行化代码。我从this上一篇文章得到了很多初步帮助,以及一个特别有帮助且耐心的XSEDE家伙。

我只使用一个节点(同时),但它的每个32个核心。我正在使用doMC而不是雪,因为超级计算机上的人正在使Rmpi运行。目前,32个核心应该(超过)对我来说足够了。我的脚本是这样的:

define a bunch of functions
load the data
call libraries
require(doMC)
require(plyr)
registerDoMC(32)

main.function <- function(data){
    *the function*
    }

results = llply(1:500, function(idx){out<-main.function(data)},.parallel=TRUE)

save(results,file="trestles_results")

这在我自己的机器上运行良好(将其设置为仅运行几次并仅注册几个核心)。但是当我在集群上运行它时,输出文件显示它运行了500次迭代中的每一次,但是没有输出文件,我收到以下错误消息:

Error in do.ply(i) : task 1 failed - "could not find function "getClass""
Calls: llply -> %dopar% -> <Anonymous>
Execution halted
Nodes:        trestles-10-28

有人知道这里发生了什么吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

为了完整起见, * ply函数有一个内置.paropts,您可以在其中指定要发送到集群节点的变量和包

results = llply(1:500, 
          function(idx){out<-main.function(data)}, 
          .parallel=TRUE,
          .paropts=list(.export=c('data','main.function'),
                        .packages=.packages(all.available=T))

或者您可以对.packages更具选择性,具体取决于main.function的复杂程度。我想因为你是在匿名函数中调用main.function,所以你需要将main.function传递给集群。

答案 1 :(得分:0)

出现这种情况的一个原因是环境尚未导出到核心。我在这里发现了一个解决方案,包括示例代码:

http://www.numbertheory.nl/2011/11/14/parallelization-using-plyr-loading-objects-and-packages-into-worker-nodes/