【问题标题】:R Reference class and doparallelR参考类和doparallel
【发布时间】:2014-03-09 06:16:42
【问题描述】:

最近,我正在尝试将引用类与parallel 一起使用。我尝试了 4 种不同的方案,多核、MPI、Socket 和 Forking。但是,只有多核才能产生正确的结果。而 MPI、PSOCK 和 Forking 都会产生错误。

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
}

【问题讨论】:

    标签: r parallel-processing reference-class


    【解决方案1】:

    问题是集群工作者需要初始化。对于这样的情况,我会使用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

    【讨论】:

    • 谢谢,有趣的是,我在自己的计算机上使用“FORK”集群没有问题,在我的学校集群(与 MPI 和 PSOCK 相同)上也有问题。但无论如何,我不会在我的学校集群上使用“FORK”。
    • 我注意到引用类“实例”,由new 创建,被克隆到工人,另一方面,Reference Class 定义没有被“克隆”到工人。
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多