R mclapply vs foreach
Posted
技术标签:
【中文标题】R mclapply vs foreach【英文标题】: 【发布时间】:2017-12-02 00:40:53 【问题描述】:我使用 mclapply 进行所有“令人尴尬的并行”计算。我发现它干净且易于使用,当参数 mc.cores = 1
和 mc.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 上是不可能的,与多核相比,foreach
或 parLapply
总是使用多会话并行性。
当使用parLapply
或foreach
和%dopar%
时,通常必须执行以下附加步骤:创建 PSOCK 集群,如果需要,注册集群,在集群工作人员上加载必要的包,导出必要的数据和对集群工作者的全局环境起作用。
这就是为什么foreach
具有.packages
和.export
之类的参数,它们使我们能够跨会话分发所需的一切。
future
包提供了多核和多会话处理 https://cran.r-project.org/web/packages/future/vignettes/future-1-overview.html 之间差异的详细信息
【讨论】:
【参考方案2】:正如 Steve Weston(foreach
的作者)所说的 here,使用 foreach
和 doParallel
作为后端,您可以初始化工作程序。这有助于更有效地为每个工作人员设置一次数据库连接,而不是为每个任务设置一次。
【讨论】:
以上是关于R mclapply vs foreach的主要内容,如果未能解决你的问题,请参考以下文章
在 foreach 循环中使用 mclapply 出现 R 错误
使用 mclapply 或 %dopar% 从对角线切片组装矩阵,例如 Matrix::bandSparse