使用 plyr 和 doMC 并行化 R 代码 : error message: Error in do. ply(i):任务 1 失败 - "could not find function "getClass""

标签 r parallel-processing cluster-computing

我刚刚开始学习如何使用远程 super 计算机来执行并行代码。我从 this 得到了很多初步帮助上一篇文章,以及一位特别乐于助人且耐心的 XSEDE 人员。

我只使用一个节点(同时),但每个节点都有 32 个核心。我使用 doMC 而不是 Snow,因为 super 计算机的那个人正在运行 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

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

提前致谢!

最佳答案

为了完整起见, *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 传递给集群。

关于使用 plyr 和 doMC 并行化 R 代码 : error message: Error in do. ply(i):任务 1 失败 - "could not find function "getClass"",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14637789/

相关文章:

R:是否可以将 2000 万多行 CSV 的读取并行化/加速到 R 中?

java - JCA访问集群中的文件

java - 连接到 Apache Kafka 多节点集群中的 Zookeeper

从字符向量中删除可能包含特殊字符而不匹配单词部分的整个单词列表

r - 你如何在 R 中粘贴项目列表

r - 通过 RasterStack 对象的单个单元格进行速度优化的循环

java - 对于 Java 中的生产者-消费者来说,什么是更好的习惯用法?

mysql集群自增不同步

r - 如何在R或RStudio中的apply()函数中嵌套Quantile()函数

r - PerformanceAnalytics 在处理基于时间的对象时出错?