【问题标题】:R mclapply vs foreachR 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)。虽然我可以执行操作系统检测,但正如您所注意到的,它还需要实现一些不同的功能。

标签: r foreach mclapply


【解决方案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 作为后端,您可以初始化工作程序。这有助于更有效地为每个工作人员设置一次数据库连接,而不是为每个任务设置一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2013-06-25
      • 1970-01-01
      • 2013-04-26
      • 2012-05-14
      相关资源
      最近更新 更多