我将mclapply用于我所有的"令人尴尬的并行"计算。我发现它干净且易于使用,并且在参数mc.cores = 1
和mc.preschedule = TRUE
时,我可以在browser()
内的函数中插入mclapply
并逐行调试,就像在常规R中一样这对于让代码更快地生成代码是一个巨大的帮助。
foreach
提供的mclapply
提供的内容是什么?我是否应该考虑编写foreach代码?
如果我理解正确,两者都可以使用multicore
方法进行并行计算(允许分叉),我希望出于性能原因使用它。
我已经看到foreach
被用在各种包中,并且已经阅读了它的基础知识,但坦率地说,我发现它并不容易使用。我也无法弄清楚如何让browser()
在foreach
函数调用中工作。 (是的,我已经阅读了这个帖子browser mode with foreach %dopar%,但没有帮助我让浏览器正常工作)。
答案 0 :(得分:1)
问题与这里描述的几乎相同:Understanding the differences between mclapply and parLapply in R。
mclapply
在调用mclapply
时为每个工作进程(线程/核心)创建主进程的克隆,从而保证了可重复性。不幸的是,在Windows上这是不可能的,与多核相比,foreach
或parLapply
总是使用多会话并行性。
将parLapply
或foreach
与%dopar%
一起使用时,通常必须执行以下附加步骤:创建PSOCK群集,根据需要注册该群集,在该群集上加载必要的程序包工作人员,将必要的数据和功能导出到集群工作人员的全球环境中。
这就是foreach
具有.packages
和.export
之类的参数的原因,这些参数使我们能够在会话之间分配所需的一切。
future
软件包提供了mulicore和多会话处理https://cran.r-project.org/web/packages/future/vignettes/future-1-overview.html
答案 1 :(得分:0)
就像史蒂夫·韦斯顿(foreach
的作者)所说的here一样,使用foreach
和doParallel
作为后端,您可以初始化worker。这对于每个工作人员一次而不是每个任务一次更有效地建立数据库连接很有帮助。