clusterApply in R:Exit Cluster如果一个任务完成并保存返回值

时间:2014-09-04 22:03:44

标签: r parallel-processing snow

如果一项任务完成(我不想等待其他任务)并获得最快计算的返回值,我想要废除集群计算:

require(snow)
library(parallel)

tasks = list(
    job1 = function(y, cl){
        EMGMM(y=y, startMy = 0)
    },
    job2 = function(y, cl){
        EMGMM(y=y, startMy = 1)
    },
    job3 = function(y, cl){
        EMGMM(y=y, startMy = 2)
    }
)

cl = makeCluster( length(tasks) )
clusterExport(cl, "dmvnorm") #needed in EMGMM()

res = clusterApply(cl, tasks, function(f) f(y))

如果我运行它,在res中存储三个作业的3个结果。但我只想要紧张工作的结果。

:)

1 个答案:

答案 0 :(得分:0)

要回答你的问题,我认为这是不可能的。节点彼此独立工作,这导致以下问题。如果节点B完成,如何在节点A上停止进程,并且节点B完全独立于节点A? (据我所知,你做不到)。

我的理解还有一个协调过程,它在clusterApply输出之前组合了所有节点的输出,因此从您的角度来看(作为用户),所有节点的输出都可供您使用同时,没有连续的结果。

如果有一个特殊的原因你想弄清楚哪个函数最快,你总是可以使用RBenchmark或者做一些简单的system.time包装函数调用。这个网站上有很多RBenchmark的例子

如果您尝试使用并行处理进行此发现,那么这不是可行的方法。

替代解决方案::

如果您的例程实际上是运行所有三个函数并获取最快的输出并继续,那么您可以执行类似的操作,让您的函数返回一个列表,其中包含函数的返回值以及函数执行的时间运行,然后选择给出该信息的最快的一个。这样你仍然可以并行运行。

例如 -

f<-function(x){
    time<-system.time(result<-replicate(5,rnorm(x)))[3]
    list(result, time)
}
f(2)
#result
#[[1]]
#          [,1]      [,2]      [,3]       [,4]       [,5]
#[1,] -0.774092 0.2368157 0.3985423 0.16720798 -0.3073049
#[2,] -0.544825 1.5665314 1.5249368 0.04576403 -2.2738331
# 
#[[2]]
#elapsed 
#   0.03 

不漂亮,但这是一种方法。