让我困惑的是:
当您安排一组任务序列,这些任务在内容上是一致的,但在处理时间上(事先不知道)是异构的,那么foreach是如何依次处理这些令人尴尬的并行任务的呢?
例如,我注册了4个线程( registerDoMC(cores=4) ),我有10个任务,第4和第5个任务的长度超过了所有其他线程的总和。第一批明显是第一、第二、第三和第四批。当第一、第二和第三项任务完成时,领班如何按顺序分配其他任务?这是随机的(从我的观察来看)?如果一些任务需要更长的时间来处理,那么什么是加快速度的好方法呢?
我很抱歉没有提供具体的例子,因为我的实际项目/代码涉及更多.
任何经验/指导/指示都是非常感谢的!
发布于 2016-11-14 00:49:44
doMC包是围绕mclapply的包装器,默认情况下,mclapply预设任务,这意味着它将任务分成组或块。扭转的是,它预先安排了那些任务--循环往复。因此,如果您有10项任务和4名员工,则任务分配如下:
如果幸运的话,这将提供合理的性能,即使任务的长度非常不同,但您可以在doMC中禁用以下预置操作:
opts <- list(preschedule=FALSE)
results <- foreach(i=1:10, .options.multicore=opts) %dopar% {
# ...
}这将导致doMC使用mc.preschedule=FALSE选项调用mclapply,以便在工人完成以前的任务(这是自然的负载平衡)时将任务分配给他们。
https://stackoverflow.com/questions/40578784
复制相似问题