R中的mclapply和foreach的区别

21
我对所有 "embarrassingly parallel" 的计算使用 mclapply。我发现它干净易用,当参数mc.cores = 1mc.preschedule = TRUE时,我可以在mclapply内的函数中插入browser(),就像在普通的 R 中一样逐行调试。这有助于更快地将代码投入生产。 foreach 相对于 mclapply 有什么优势?我是否应该考虑编写 foreach 代码? 如果我理解正确,两者都可以使用并行计算(允许分叉)的multicore方法,我喜欢出于性能原因使用它。
我已经看到在各种包中使用了foreach,并且已经阅读了基础知识,但老实说我没有找到它很容易使用。我也无法弄清楚如何使foreach函数调用中的browser()工作。(是的,我已经阅读了这个线程browser mode with foreach %dopar%,但没帮助我正确使浏览器工作)。

6
有时我们使用 foreach 而不是 parallel 的一个原因是,简单地说 mclapply 在 Windows 系统下默认情况下不起作用(而且很多用户仍在使用 Windows)。尽管我可以进行操作系统检测,但正如你所注意到的,这也需要对函数进行稍微不同的实现。 - FM Kerckhof
2个回答

2
问题几乎与此处描述的相同:Understanding the differences between mclapply and parLapply in R
在调用mclapply时,它为每个工作进程(线程/核心)创建主进程的克隆,因此保证了可重复性。不幸的是,在Windows上无法实现这一点,与多核相反,它总是使用foreachparLapply的多会话并行处理。
当使用parLapplyforeach%dopar%时,通常需要执行以下附加步骤:创建PSOCK集群,注册集群(如果需要),在集群工作程序中加载必要的软件包,将必要的数据和函数导出到集群工作程序的全局环境中。
这就是为什么foreach具有像.packages.export这样的参数,使我们能够在会话之间分发所需的所有内容。 future软件包提供了关于多核和多会话处理之间差异的详细信息:https://cran.r-project.org/web/packages/future/vignettes/future-1-overview.html

0
foreach的作者Steve Weston在这里所说,使用 doParallel 作为后端来与 foreach 一起使用,你可以初始化workers。这对于每个worker仅需一次有效地设置数据库连接而言是有帮助的,而不是每个任务都需要进行一次连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接