clusterApply in R:如果一个任务完成,则退出Cluster并保存返回值



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

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个结果。但我只想要法斯特工作的结果。

:)

为了回答您的问题,我认为这是不可能的。节点彼此独立工作,这就引出了以下问题。如果节点B完成,并且节点B完全独立于节点A,您如何停止节点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 

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

相关内容

  • 没有找到相关文章

最新更新