Как отключить соединение с открытым R кластером, используя - PullRequest
0 голосов
/ 05 сентября 2018

В вопросе здесь OP упоминается с помощью kill для остановки каждого отдельного процесса, хорошо, потому что я не знал, что соединения остаются открытыми, если вы нажмете «Стоп» при выполнении этого параллельно в R Studio на Windows 10, и я, как дурак, пытался запускать одно и то же 4-5 раз, так что теперь у меня есть около 15 открытых соединений на моих бедных 3-ядерных машинах, которые крадут все мои процессоры. Я могу перезапустить мой 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 голосов
/ 05 сентября 2018

Используйте

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, если хотите, чтобы он был совершенно бесшумным.

...