R参考类和多重并行

时间:2014-03-09 06:16:42

标签: r parallel-processing reference-class

最近,我正在尝试使用parallel的引用类。我尝试了4种不同的方案,多核,MPI,套接字和分叉。但是,只有多核能够产生正确的结果。和MPI,PSOCK和分叉都会产生错误。

PS:我在支持MPI的计算机集群上运行此脚本。

library(doParallel)

np = 4L
# cl <- makeCluster(np, type="MPI", outfile = "")
# cl <- makeCluster(np, type="PSOCK", outfile = "")
# cl <- makeCluster(np, type="FORK", outfile = "")
cl <- np # multicore

registerDoParallel(cl)
myClass = setRefClass("myClass",
    fields = c("a"),
    methods = list(
        hello = function(){cat("hello\n")},
        show = function(){cat("show\n")}
    )
)
objs = foreach(i = 1:4) %dopar% {
    obj = new("myClass")
    obj$a=i
    obj
}

可能与parallel computations on Reference Classes

有关

更新

更多调查显示,克隆了引用类实例,但没有引用类定义。

library(doParallel)

np = 4L
cl <- makeCluster(np, type="MPI", outfile = "")
# cl <- makeCluster(np, type="PSOCK", outfile = "")
# cl <- makeCluster(np, type="FORK", outfile = "")
# cl <- np # multicore
registerDoParallel(cl)

myClass = setRefClass("myClass",
    fields = c("a"),
    methods = list(
        hello = function(){cat("hello\n")},
        show = function(){cat("show\n")}
    )
)
obj = new("myClass")
obj$a = 0

results = foreach(i = 1:4) %dopar% {
    obj$a # no error
    newobj = new("myClass") # error
}

1 个答案:

答案 0 :(得分:2)

问题是群集工作者需要初始化。对于这样的情况,我会使用clusterEvalQclusterCall

clusterEvalQ(cl, {
    myClass <- setRefClass("myClass",
                           fields = c("a"),
                           methods = list(
                               hello = function(){cat("hello\n")},
                               show = function(){cat("show\n")}
                           ))
    NULL
})

请注意,我在R表达式中包含了“NULL”,以避免序列化并从集群工作者返回生成器函数。

使用“多核”版本时不需要此初始化,因为使用了mclapply,因此工作程序由于已执行初始化的主进程分叉而初始化。

有趣的是,在使用“FORK”群集时,您不必进行此初始化,但必须在创建“FORK”群集之前调用setRefClass