7

The documentation for doMC seems very sparse, listing only doMC-package and registerDoMC(). The problem I'm encountering is I'll spawn several workers via doMC/foreach, but then when the job is done they just sit there taking up memory. I can go and hunt their process IDs, but I often kill the master process by accident.

library(doMC)
library(foreach)

registerDoMC(32)

foreach(i=1:32) %dopar% foo()

##kill command here?

I've tried following with registerDoSEQ() but it doesn't seem to kill off the processes.

4

4 回答 4

6

doMC 包基本上是 mclapply 函数的包装器,mclapply 派生了应该在返回之前退出的工作程序。它不使用像雪包或并行包中的雪派生函数这样的持久性工作者,因此它不需要像 stopCluster 这样的函数来关闭工作者。

直接使用 mclapply 时,你看到同样的问题吗?当您调用具有较小内核值的 registerDoMC 时,它是否工作得更好?

您是否在 Mac 上使用 IDE(例如 RStudio 或 R.app)中的 doMC?如果是这样,您可能想尝试从终端使用 R 来查看是否有所不同。在 IDE 中调用 fork 可能会出现问题。

于 2014-02-14T04:54:31.110 回答
3

我从来没有为 doMC 找到合适的解决方案,所以有一段时间我一直在做以下事情:

library(doParallel)
cl <- makePSOCKcluster(4) # number of cores to use
registerDoParallel(cl)

## computation

stopCluster(cl)

每次都有效。

于 2016-04-04T13:40:55.050 回答
0

如果你使用doParallel包,并使用registerDoParallel(8)数字,你可以unloadNamespace("doParallel")用来杀死多进程

如果您有集群的名称,您可以使用stopCluster(cl)它来移除额外的工作人员

于 2019-11-09T09:35:20.273 回答
-1

通过使用 registerDoSEQ() 您只需注册顺序工作者,因此所有并行工作者都应该停止。这不是一个完整的解决方案,但在某些情况下应该可以工作。

于 2016-11-29T12:59:49.490 回答