每次我想在 R 中使用 foreach() 时,是否都必须注册DoParallel() 和 stopCluster() ?

sta*_*vro 7 parallel-processing r doparallel

我读到您必须stopCluster()在运行并行函数后使用:foreach()在 R 中。但是,我可以逃脱registerDoParallel(),然后运行foreach()任意多次,而无需使用stopCluster()。那我到底需要stopCluster()还是不需要?

不使用是否stopCluster()意味着您的核心正在忙于当前的任务?因此,如果我使用并行编程,中间只执行一点点单核顺序任务,那么我就不需要这样做stopCluster()?据我所知,设置并行也会产生大量的开销时间消耗。

Flo*_*ian 12

parallel::makeCluster()doParallel::registerDoParallel()创建一组并行运行的 R 副本。这些副本称为工人

\n

parallel::stopCluster()并且doParallel::stopImplicitCluster()是关闭工人的安全方法。从帮助页面?stopCluster

\n
\n

最好通过调用 \xe2\x80\x98stopCluster\xe2\x80\x99 来关闭工作线程:但是,一旦它们正在侦听命令的套接字不可用,工作线程将自行终止,如果主 R 应该这样做会话已完成(或其进程终止)。

\n
\n

事实上,未使用的工作线程的 CPU 使用率通常可以忽略不计。然而,如果工作人员加载大型 R 对象(例如大型数据集),他们可能会使用大部分内存,从而减慢计算速度。在这种情况下,关闭未使用的worker会更有效率。

\n

  • 仅供参考,在 [future](https://cran.r-project.org/package=future) 1.10.0(免责声明:我是作者)中,我添加了对未使用的集群/workers 自动垃圾收集的支持。将 `cl <- parallel::makeCluster(...)` 替换为 `cl <- future::makeClusterPSOCK(..., autoStop = TRUE)` 将导致 R 在变量 `cl` 时自动调用 `stopCluster()`已被删除,例如从“rm(cl)”中删除,或者只是函数中的局部变量。没什么神奇的,只是一个让生活变得更轻松的附加功能。(稍后我可能会将 `autoStop = TRUE` 设置为默认值)。 (5认同)