这就是令我困惑的事情:
当您使用foreach计划一系列内容相同但在处理时间(事前未知)方面异质的任务时,foreach如何按顺序处理这些令人尴尬的并行任务?
例如,我注册了4个帖子registerDoMC(cores=4)
,我有10个任务,第4个和第5个每个结果比其他所有组合更长。然后第一批显然是第1,第2,第3和第4批。当完成第1,第2和第3次时,foreach如何按顺序分配其他任务?这是随机的(从我的观察来看似乎如此)?如果事实证明某些任务需要花费更长的时间来处理,那么加速的好方法是什么?
我很抱歉没有提供具体的例子,因为我的实际项目/代码涉及得更多......
非常感谢任何经验/指导/指示!
答案 0 :(得分:5)
doMC包是mclapply的包装器,默认情况下是mclapply 预先计划任务,这意味着它将任务分成组或块。扭曲是它预先安排这些任务循环。因此,如果您有10个任务和4个工作人员,则将按如下方式分配任务:
如果你很幸运,即使任务的长度不同,这也会给出合理的性能,但你可以按照以下方式禁用doMC中的预调度:
opts <- list(preschedule=FALSE)
results <- foreach(i=1:10, .options.multicore=opts) %dopar% {
# ...
}
这将导致doMC使用mc.preschedule=FALSE
选项调用mclapply,以便在完成上一个自然负载平衡的任务时将任务分配给工作人员。