Как остановить foreach %dopar%, не испортив сеанс

Я довольно часто использую допар foreach в R, чтобы воспользоваться преимуществами многоядерности и ускорить выполнение специального анализа в интерактивных сеансах.

Однако иногда я замечал, что если я вырвался из параллельных циклов for (обычно когда я понял, что что-то не так в рабочих потоках), нажав control-c, сеанс будет испорчен в том смысле, что когда я использую foreach dopar снова, все будет выполняться только одним потоком (top не будет отображать несколько процессов, как обычно, плюс работа займет много времени по сравнению с тем, когда работает распараллеливание). Это происходит не при каждом control-c, но достаточно часто, чтобы раздражать (перезагрузка всего сеанса из нового сеанса может раздражать)

Есть ли способ предотвратить это или, по крайней мере, способ исправить среду, когда это произойдет?


person mochajave    schedule 04.08.2016    source источник


Ответы (1)


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

myClusters <- makeCluster(4) #the number should reflect your system and project
registerDoParallel(myClusters)

и вы можете использовать что-то вроде

on.exit(stopCluster(myCluster))

Если вы настроите его таким образом, то вы должны быть в порядке при выходе. Возможно, вам потребуется запустить

gc() в консоли, чтобы вытащить мусор....

person sconfluentus    schedule 05.08.2016
comment
О, круто, я бегаю с killall -u me уже 2 года - person JustGettinStarted; 23.01.2017