Как убить работника 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(), вы просто регистрируете последовательного работника, поэтому все параллельные работники должны остановиться. Это не полное решение, но в некоторых случаях оно должно работать.