r - 并行化 R : foreach, doMC 中的异构任务,doParallel

标签 r multithreading foreach parallel-processing

这是让我困惑的地方:

当您使用 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/

相关文章:

unix - 在 shell 中进行基本统计的最佳方式?

c++ - 如何正确地将此指针传递给 std::thread

PHP PDO 查询,具有从数组中获取的多个条件

php - 必须有一个更简单的方法..从 mysql 中提取数据

R:如何更改 ggvis Shiny 应用程序中特定范围的绘图背景颜色

r - 使用specaccum绘制R中一个位点的物种积累曲线

用于与 IRC 服务器通信的 Java 套接字

在 foreach 循环中使用 array_combine 时 PHP 内存耗尽

r - 按组区分采样率

Java-启动线程问题