如何使用并行关闭开放的R群集连接

时间:2018-09-05 17:35:08

标签: r parallel-processing doparallel snow

在问题here中,OP提到使用kill来停止每个单独的进程,这是因为我不知道如果您在并行运行此命令时按下“停止”,则连接仍保持打开状态在Windows 10的R Studio中,像个傻瓜一样,我试图运行4-5次相同的东西,所以现在我在3台可怜的3台核心计算机上大约有15个打开的连接正在偷吃我的所有CPU。我可以重新启动R,但是随后我必须收回所有这些未保存的对象,这将花费一个小时,而我宁愿不要浪费时间。同样,链接文章中的答案很好,但所有答案都与将来如何预防问题有关,而不是与解决问题后的实际解决方法有关。

所以我正在寻找类似的东西:

# causes problem
lapply(c('doParallel','doSNOW'), library, character.only = TRUE)
n_c <- detectCores()-1
cl<- makeCluster(n_c)
registerDoSNOW(cl)
stop()
stopCluster(cl)  #not reached

# so to close off the connection we use something like
a <- showConnections()
cls$description %>% kill

问题非常令人沮丧,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用

autoStopCluster <- function(cl) {
  stopifnot(inherits(cl, "cluster"))
  env <- new.env()
  env$cluster <- cl
  attr(cl, "gcMe") <- env
  reg.finalizer(env, function(e) {
    message("Finalizing cluster ...")
    message(capture.output(print(e$cluster)))
    try(parallel::stopCluster(e$cluster), silent = FALSE)
    message("Finalizing cluster ... done")
  })
  cl
}

,然后将群集设置为:

cl <- autoStopCluster(makeCluster(n_c))

收集垃圾时,将不再自动停止不再可用的旧群集对象。您可以通过调用gc()来触发垃圾回收器。例如,如果您致电:

cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
cl <- autoStopCluster(makeCluster(n_c))
gc()

并查看您的OS进程监视器,您将看到启动了许多工作程序,但是最终,当垃圾收集器运行时,仅保留了最新的集群工作程序集。

EDIT 2018-09-05:添加了调试输出消息,以显示已注册的终结器运行时的情况,这在垃圾收集器运行时发生。删除那些message()行,并使用silent = TRUE,如果您希望它完全静音。