R-foreach循环中的负载平衡
有没有办法修改R foreach循环如何使用doParallel后端进行负载平衡?当并行化具有非常不同执行时间的任务时,可能会发生除了一个节点之外的所有节点都已完成其任务,而最后一个节点仍有多个任务要执行。以下是一个玩具示例:R-foreach循环中的负载平衡,r,foreach,parallel-processing,load-balancing,doparallel,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) fore
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循环中的负载平衡在默认情况下似乎是将任务总数拆分为具有注册内核数长度的集合,因此在上述示例中,第一个内核接收所有waittime
=10的任务,而其他3个核接收的任务waittime
=1,因此这3个核将在第一个核完成其第一个任务之前完成其所有任务
有没有办法让foreach()
一次分配一个任务?i、 e.在上述情况下,我希望前4个任务分布在4个核心之间,然后每个下一个任务分布到下一个可用的核心
谢谢。很抱歉,我没有足够的代表发表评论。您是否可以重写代码以使用parlappylb或parapplylb parLapplyLB、PARAPPLYLB是负载平衡版本,用于将乐趣应用到X的不同元素时,需要相当多的时间,并且功能是确定性的或不需要可再现的结果
我自己还没有测试过,但是
doParallel
后端提供了一个preschedule
选项,类似于mclappy()
中的mc.preschedule
参数。(见本手册第7节。)
您可以尝试:
mcoptions <- list(preschedule = FALSE)
foreach(i = w, .options.multicore = mcoptions)
mcoptions如果可能的话,我肯定更愿意和foreach呆在一起。在我的应用程序中,foreach循环中的内容要比我在示例中输入的两个命令复杂得多,因此将代码转换为单个函数可能会很复杂。无论如何,谢谢你。我猜你在制作一个非常有限的例子,如果你能用parlappy在forloop中以函数的形式编写代码,那就很简单了。