这是让我困惑的地方:
当您使用 foreach 安排一系列在内容方面同质但在处理时间(事前未知)方面异质的任务时,foreach 究竟如何按顺序处理这些令人尴尬的并行任务?
例如,我注册了 4 个线程 registerDoMC(cores=4)
,我有 10 个任务,第 4 和第 5 个都比其他所有任务加起来都长。那么第一批显然是第1、2、3、4。当1st,2nd,3rd都做完了,foreach到底是怎么依次分配其他任务的呢?那是随机的吗(从我的观察看来是这样)?如果事实证明某些任务需要更长的时间来处理,那么加快速度的好做法是什么?
我很抱歉没有提供具体的例子,因为我的实际项目/代码涉及更多...
非常感谢任何经验/指导/指点!
最佳答案
doMC 包是 mclapply 的包装器,默认情况下 mclapply preschedules 任务,这意味着它将任务分成组或 block 。不同之处在于它预先安排了这些任务的循环。因此,如果您有 10 个任务和 4 个 worker ,任务将分配如下:
- worker 1:任务 1、5、9
- worker 2:任务 2、6、10
- worker 3:任务 3、7
- worker 4:任务 4、8
如果幸运的话,即使任务的长度非常不同,这也会提供合理的性能,但您可以按如下方式在 doMC 中禁用预调度:
opts <- list(preschedule=FALSE)
results <- foreach(i=1:10, .options.multicore=opts) %dopar% {
# ...
}
这将导致 doMC 使用 mc.preschedule=FALSE
选项调用 mclapply,以便在 worker 完成他们之前的任务时将任务分配给他们,这自然是负载平衡。
关于r - 并行化 R : foreach, doMC 中的异构任务,doParallel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40578784/