我在所有的“令人尴尬的并行”计算中使用mclapply。我发现它干净易用,当参数mc.cores = 1和mc.preschedule = TRUE时,我可以在mclapply中插入browser()并逐行调试,就像在普通的R中一样--这对于更快地实现代码的生成是一个巨大的帮助。
foreach提供的mclapply没有提供什么?有什么原因我应该考虑写前瞻代码前进吗?
如果我正确理解,两种方法都可以使用multicore方法进行并行计算(允许分叉),出于性能原因,我喜欢使用这种方法。
我已经看到foreach在不同的包中被使用,并且阅读了它的基本知识,但坦率地说,我发现它并不容易使用。我也想不出如何让browser()在foreach函数调用中工作。(是的,我读过这个线程browser mode with foreach %dopar%,但没有帮助我使浏览器正常工作)。
发布于 2020-11-01 16:49:44
这个问题几乎与这里描述的问题相同:Understanding the differences between mclapply and parLapply in R。
mclapply正在为每个工作进程(线程/核心)在调用mclapply时创建主进程的克隆,保证可再现性。不幸的是,这在Windows上是不可能的,因为与多核相比,foreach或parLapply总是使用多会话并行。
当将parLapply或foreach与%dopar%一起使用时,通常需要执行以下附加步骤:创建PSOCK集群,根据需要注册集群,在集群工作人员上加载必要的包,将必要的数据和函数导出到集群工作人员的全局环境。
这就是为什么foreach有像.packages和.export这样的参数,使我们能够在会话之间分发所需的一切。
future包提供了多进程和多会话处理https://cran.r-project.org/web/packages/future/vignettes/future-1-overview.html之间区别的详细信息。
发布于 2020-07-18 01:03:30
正如Steve (“foreach”的作者)所说的那样,使用foreach和doParallel作为后端,您可以初始化工作人员。这可以帮助每个工作人员更有效地设置数据库连接一次,而不是每任务一次。
https://stackoverflow.com/questions/44806048
复制相似问题