如果一个任务完成,我想记录集群计算(我不想等待其他任务),并获得最快计算的返回值:
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
不漂亮,但这是一种方法。