Как убить работника doMC, когда это будет сделано?

Документация для doMC кажется очень скудной, перечисляя только doMC-пакет и registerDoMC(). Проблема, с которой я сталкиваюсь, состоит в том, что я порождаю нескольких рабочих через doMC/foreach, но затем, когда работа закончена, они просто сидят и занимают память. Я могу пойти и поохотиться на их идентификаторы процессов, но я часто убиваю основной процесс случайно.

library(doMC)
library(foreach)

registerDoMC(32)

foreach(i=1:32) %dopar% foo()

##kill command here?

Я попытался следовать с registerDoSEQ(), но это, кажется, не убивает процессы.

3 ответа

Решение

Я никогда не находил подходящего решения для doMC, поэтому какое-то время я делал следующее:

library(doParallel)
cl <- makePSOCKcluster(4) # number of cores to use
registerDoParallel(cl)

## computation

stopCluster(cl)

Работает каждый раз.

Пакет doMC - это, по сути, оболочка для функции mclapply, и mclapply разветвляет рабочих, которые должны выйти до его возвращения. Он не использует постоянных рабочих, таких как пакет snow или функции, полученные из снега, в параллельном пакете, поэтому ему не нужна такая функция, как stopCluster, для выключения рабочих.

Вы видите ту же проблему при использовании mclapply напрямую? Работает ли лучше, когда вы вызываете registerDoMC с меньшим значением для ядер?

Используете ли вы doMC из IDE, такой как RStudio или R.app на Mac? Если это так, вы можете попробовать использовать R из терминала, чтобы увидеть, если это имеет значение. Может быть проблема с вызовом fork в IDE.

Если вы используете doParallel пакет и использование registerDoParallel(8) с числами, которые вы можете использовать unloadNamespace("doParallel") убить мульти процесс

И если у вас есть имя для кластеров, вы можете использовать stopCluster(cl) убрать лишних рабочих

Используя registerDoSEQ(), вы просто регистрируете последовательного работника, поэтому все параллельные работники должны остановиться. Это не полное решение, но в некоторых случаях оно должно работать.

Другие вопросы по тегам