如果一项任务完成(我不想等待其他任务)并获得最快计算的返回值,我想要废除集群计算:
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个结果。但我只想要紧张工作的结果。
:)
答案 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
不漂亮,但这是一种方法。