doMC的文档似乎非常稀疏,仅列出了doMC-package和registerDoMC()。我遇到的问题是我会通过doMC / foreach产生几个工作者,但是当工作完成后,他们只是坐在那里占用内存。我可以去寻找他们的进程ID,但我经常意外地杀死主进程。
library(doMC)
library(foreach)
registerDoMC(32)
foreach(i=1:32) %dopar% foo()
##kill command here?
我已经尝试过使用registerDoSEQ(),但它似乎没有杀掉进程。
答案 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(),您只需注册顺序工作程序,因此所有并行工作程序都应该停止。这不是一个完整的解决方案,但在某些情况下应该可以使用。