如何杀死doMC工作人员?

时间:2014-02-13 15:43:02

标签: r foreach parallel-processing domc

doMC的文档似乎非常稀疏,仅列出了doMC-package和registerDoMC()。我遇到的问题是我会通过doMC / foreach产生几个工作者,但是当工作完成后,他们只是坐在那里占用内存。我可以去寻找他们的进程ID,但我经常意外地杀死主进程。

library(doMC)
library(foreach)

registerDoMC(32)

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

##kill command here?

我已经尝试过使用registerDoSEQ(),但它似乎没有杀掉进程。

4 个答案:

答案 0 :(得分:5)

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

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

您是否在Mac上使用IDE(如RStudio或R.app)中的doMC?如果是这样,您可能需要尝试使用终端中的R来查看是否会产生影响。在IDE中调用fork可能会出现问题。

答案 1 :(得分:3)

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

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

## computation

stopCluster(cl)

每次都有效。

答案 2 :(得分:0)

如果您使用smth软件包,并使用带有数字的using 您可以使用doParallel杀死多进程

如果您具有群集的名称,则可以使用registerDoParallel(8)删除多余的工作线程

答案 3 :(得分:-1)

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