R mclapply vs foreach

时间:2017-06-28 14:55:49

标签: r foreach mclapply

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

foreach提供的mclapply提供的内容是什么?我是否应该考虑编写foreach代码?

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

这就是foreach具有.packages.export之类的参数的原因,这些参数使我们能够在会话之间分配所需的一切。

future软件包提供了mulicore和多会话处理https://cran.r-project.org/web/packages/future/vignettes/future-1-overview.html

之间的区别的详细信息

答案 1 :(得分:0)

就像史蒂夫·韦斯顿(foreach的作者)所说的here一样,使用foreachdoParallel作为后端,您可以初始化worker。这对于每个工作人员一次而不是每个任务一次更有效地建立数据库连接很有帮助。