【发布时间】:2017-03-09 09:01:11
【问题描述】:
有没有办法修改 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循环中的负载均衡默认情况下似乎是将任务总数拆分为长度为已注册核心数的集合,因此在上面的示例中,第一个核心接收所有带有@的任务987654324@ = 10,而其他 3 个接收具有waittime = 1 的任务,因此这 3 个内核将在第一个完成第一个之前完成所有任务。
有没有办法让foreach() 一次分发一个任务?即在上述情况下,我希望前 4 个任务分布在 4 个核心之间,然后将每个下一个任务分配给下一个可用核心。
谢谢。
【问题讨论】:
标签: r foreach parallel-processing load-balancing doparallel