R mclapply vs foreach

Posted

技术标签:

【中文标题】R mclapply vs foreach【英文标题】: 【发布时间】:2017-12-02 00:40:53 【问题描述】:

我使用 mclapply 进行所有“令人尴尬的并行”计算。我发现它干净且易于使用,当参数 mc.cores = 1mc.preschedule = TRUE 我可以在 mclapply 内的函数中插入 browser() 并像在常规 R 中一样逐行调试。这对获取有很大帮助将代码更快地投入生产。

foreach 提供哪些 mclapply 不提供的功能?我有理由考虑编写 foreach 代码吗?

如果我理解正确,两者都可以使用multicore 方法进行并行计算(允许分叉),出于性能原因,我喜欢使用这种方法。

我已经看到foreach 被用于各种包中,并且已经阅读了它的基础知识,但坦率地说,我觉得它并不容易使用。我也无法弄清楚如何让browser()foreach 函数调用中工作。 (是的,我已阅读此主题 browser mode with foreach %dopar%,但没有帮助我让浏览器正常工作)。

【问题讨论】:

我们有时使用foreach 而不是parallel 的一个原因是mclapply 在默认情况下在Windows 下不起作用(许多用户仍在使用Windows)。虽然我可以执行操作系统检测,但正如您所注意到的,它还需要实现一些不同的功能。 【参考方案1】:

问题与此处描述的几乎相同:Understanding the differences between mclapply and parLapply in R。

mclapply 在调用mclapply 时为每个工作进程(线程/核心)创建主进程的克隆,保证了可重复性。不幸的是,这在 Windows 上是不可能的,与多核相比,foreachparLapply 总是使用多会话并行性。

当使用parLapplyforeach%dopar% 时,通常必须执行以下附加步骤:创建 PSOCK 集群,如果需要,注册集群,在集群工作人员上加载必要的包,导出必要的数据和对集群工作者的全局环境起作用。

这就是为什么foreach 具有.packages.export 之类的参数,它们使我们能够跨会话分发所需的一切。

future 包提供了多核和多会话处理 https://cran.r-project.org/web/packages/future/vignettes/future-1-overview.html 之间差异的详细信息

【讨论】:

【参考方案2】:

正如 Steve Weston(foreach 的作者)所说的 here,使用 foreachdoParallel 作为后端,您可以初始化工作程序。这有助于更有效地为每个工作人员设置一次数据库连接,而不是为每个任务设置一次。

【讨论】:

以上是关于R mclapply vs foreach的主要内容,如果未能解决你的问题,请参考以下文章

在 foreach 循环中使用 mclapply 出现 R 错误

使用 mclapply 或 %dopar% 从对角线切片组装矩阵,例如 Matrix::bandSparse

parallel::mclapply() 添加或删除对全局环境的绑定。哪个?

forEachfor infor of三者区别

forEachfor...infor...of

mclapply 使用所有内核但不是所有线程