如何使用并行关闭打开的 R 集群连接
How to shut down an open R cluster connection using parallel
在问题 here 中,OP 提到使用 kill
来停止每个单独的进程,因为我不知道如果你在按下 "stop" 时连接保持打开状态运行在 Windows 10 上在 R Studio 中并行执行此操作,我像个傻瓜一样尝试 运行 同样的事情 4-5 次,所以现在我的上有大约 15 个打开的连接可怜的 3 台核心机器偷走了我所有的 CPU。我可以重新启动我的 R,但随后我必须回收所有这些未保存的对象,这将花费一个小时,我不想浪费时间。同样,链接 post 中的答案很好,但所有答案都是关于如何防止将来出现问题,而不是如何在遇到问题时实际解决问题。
所以我正在寻找类似的东西:
# 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
这个问题非常令人沮丧,我们将不胜感激。
使用
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()
并观察您的操作系统进程监视器,您会看到启动了很多工作程序,但最终当垃圾收集器运行时,只剩下最新的一组集群工作程序。
编辑 2018-09-05:添加了调试输出消息以显示已注册的终结器何时运行,这在垃圾收集器运行时发生。如果您希望它完全静音,请删除那些 message()
行并使用 silent = TRUE
。
在问题 here 中,OP 提到使用 kill
来停止每个单独的进程,因为我不知道如果你在按下 "stop" 时连接保持打开状态运行在 Windows 10 上在 R Studio 中并行执行此操作,我像个傻瓜一样尝试 运行 同样的事情 4-5 次,所以现在我的上有大约 15 个打开的连接可怜的 3 台核心机器偷走了我所有的 CPU。我可以重新启动我的 R,但随后我必须回收所有这些未保存的对象,这将花费一个小时,我不想浪费时间。同样,链接 post 中的答案很好,但所有答案都是关于如何防止将来出现问题,而不是如何在遇到问题时实际解决问题。
所以我正在寻找类似的东西:
# 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
这个问题非常令人沮丧,我们将不胜感激。
使用
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()
并观察您的操作系统进程监视器,您会看到启动了很多工作程序,但最终当垃圾收集器运行时,只剩下最新的一组集群工作程序。
编辑 2018-09-05:添加了调试输出消息以显示已注册的终结器何时运行,这在垃圾收集器运行时发生。如果您希望它完全静音,请删除那些 message()
行并使用 silent = TRUE
。