0

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

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

:)

4

1 回答 1

0

要回答你的问题,我认为这是不可能的。节点彼此独立工作,这导致了以下问题。如果节点 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 

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

于 2014-09-04T22:42:55.740 回答