R foreach循环中的负载平衡

时间:2017-03-09 09:01:11

标签: r foreach parallel-processing load-balancing doparallel

有没有办法修改R foreach循环如何使用doParallel后端进行负载均衡?并行执行具有非常不同的执行时间的任务时,可能会发生所有节点,但一个节点已完成其任务,而最后一个节点仍有几个任务要执行。这是一个玩具示例:

library(foreach)
library(doParallel)

registerDoParallel(4)

waittime = c(10,1,1,1,10,1,1,1,10,1,1,1,10,1,1,1)

w = iter(waittime)

foreach(i=w) %dopar% {
    message(paste("waiting",i, "on",Sys.getpid()))
    Sys.sleep(i)
}

基本上,代码寄存器4个核心。对于每个循环i,任务是等待waittime[i]秒。但是,因为默认情况下,foreach循环中的负载平衡似乎是将任务总数拆分为具有已注册核心数长度的集合,在上面的示例中,第一个核心接收所有任务{ {1}} = 10,而其他3个接收waittime = 1的任务,这样这三个核心就可以在第一个完成第一个任务之前完成所有任务。

有没有办法让waittime一次分配一个任务?即,在上述情况下,我希望前4个任务分布在4个核心中,然后将每个下一个任务分配给下一个可用核心。

感谢。

2 个答案:

答案 0 :(得分:4)

我自己没有测试过,但doParallel后端提供的preschedule选项类似于mc.preschedule中的mclapply()参数。 (参见doParallel vignette的第7节。)

您可以尝试:

mcoptions <- list(preschedule = FALSE)
foreach(i = w, .options.multicore = mcoptions)

答案 1 :(得分:1)

道歉作为回答发布但我没有足够的回复评论。您是否可以重写代码以使用parLapplyLB或parSapplyLB?

  

parLapplyLB,parSapplyLB是负载平衡版本,旨在将FUN应用于X的不同元素时使用需要相当多的时间,并且该函数是确定性的或不需要可重现的结果。