Подтвердить что ты не робот

"un-register" doParallel cluster

Если я запустил foreach... %dopar% без регистрации кластера, foreach выдает предупреждение и выполняет код последовательно:

library("doParallel")
foreach(i=1:3) %dopar%
  sqrt(i)

Урожайность:

Warning message:
executing %dopar% sequentially: no parallel backend registered 

Однако, если я запустил этот же код после запуска, регистрации и остановки кластера, он терпит неудачу:

cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
foreach(i=1:3) %dopar%
  sqrt(i)

Урожайность:

Error in summary.connection(connection) : invalid connection

Есть ли противоположность registerDoParallel(), которая очищает регистрацию кластера? Или я застрял с призраком старого кластера, пока не заново запустил сеанс R?

/edit: некоторый googling показывает функцию bumphunter:::foreachCleanup() в пакете bumphunter Biocondoctor:

function () 
{
    if (exists(".revoDoParCluster", where = doParallel:::.options)) {
        if (!is.null(doParallel:::.options$.revoDoParCluster)) 
            stopCluster(doParallel:::.options$.revoDoParCluster)
        remove(".revoDoParCluster", envir = doParallel:::.options)
    }
}
<environment: namespace:bumphunter>

Однако эта функция, похоже, не устраняет проблему.

library(bumphunter)
cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
bumphunter:::foreachCleanup()
foreach(i=1:3) %dopar%
  sqrt(i)

Где foreach хранит информацию о зарегистрированном кластере?

4b9b3361

Ответ 1

Единственный официальный способ "отменить регистрацию" бэкэнда foreach - зарегистрировать последовательный бэкэнд:

registerDoSEQ()

Это имеет смысл для меня, потому что вы должны объявить, какой бэкэнд использовать, поэтому я не видел смысла указывать способ "унаследовать", какой бэкэнд использовать. Вместо этого вы заявляете, что хотите использовать последовательный бэкэнд, который по умолчанию.

Первоначально я считал включение функции "отменить регистрацию", но поскольку я не мог убедить себя в том, что это было полезно, я решил оставить ее, так как гораздо проще добавить функцию, чем удалить ее.

Считаю, что все, что вам нужно сделать, это удалить все переменные из foreach:::.foreachGlobals, где foreach сохраняет все свое состояние:

unregister <- function() {
  env <- foreach:::.foreachGlobals
  rm(list=ls(name=env), pos=env)
}

После вызова этой функции любой параллельный бэкэнд будет снят с регистрации, и предупреждение выдается снова, если вызывается %dopar%.

Ответ 2

    cl <- makeCluster(2)
    registerDoParallel(cl)
    on.exit(stopCluster(cl))

Это сработало для меня.