20

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

提供什么不foreach提供mclapply?我有理由考虑编写 foreach 代码吗?

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

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

4

2 回答 2

2

问题与此处描述的几乎相同:了解 R 中的 mclapply 和 parLapply 之间的区别

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

使用parLapplyor foreachwith 时%dopar%,通常需要执行以下附加步骤:创建 PSOCK 集群,根据需要注册集群,在集群工作人员上加载必要的包,将必要的数据和功能导出到集群工作人员的全局环境。

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

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

于 2020-11-01T16:49:44.340 回答
0

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

于 2020-07-18T01:03:30.940 回答