2013-06-26 2 views
36

Я испытываю трудную задачу отладки с makePSOCKcluster из пакета parallel на R x64 в Windows. Это не происходит на R i386 в Windows, ни на любом OSX или Linux. К сожалению, это не происходит последовательно, только изредка и довольно случайным образом.makePSOCKcluster зависает на выигрыше x64 после вызова системы

Что происходит, так это то, что функция makePSOCKcluster отключает и затягивает сеанс R, но только если раньше в сеансе выполнялись некоторые (произвольные) вызовы system(). Видео и сценарий ниже иллюстрируют проблему более четко.

Некоторые вещи я безуспешно:

  • Отключение антивирусов/брандмауэров.
  • Ожидание пары секунд между звонками system и makePSOCKcluser.
  • Использование различных системных вызовов.

Как бы я еще сузил это? Здесь the video и скрипт, используемый в видео:

cmd_exists <- function(command){ 
    iswin <- identical(.Platform$OS.type, "windows"); 
    if(iswin){ 
    test <- suppressWarnings(try(system(command, intern=TRUE, ignore.stdout=TRUE, ignore.stderr=TRUE, show.output.on.console=FALSE), silent=TRUE)); 
    } else { 
    test <- suppressWarnings(try(system(command, intern=TRUE, ignore.stdout=TRUE, ignore.stderr=TRUE), silent=TRUE));  
    } 
    !is(test, "try-error") 
} 

options(hasgit = cmd_exists("git --version")); 
options(haspandoc = cmd_exists("pandoc --version")); 
options(hastex = cmd_exists("texi2dvi --version")); 
cluster <- parallel::makePSOCKcluster(1); 
+2

+1 для нестандартной видео идеи ... – agstudy

+0

поэтому, если вы удалите вызовы options(), проблем нет? вы можете попробовать проверить, есть ли в частности ... Вы также можете посмотреть реализацию makePSOCKcluster и посмотреть, где он висит. –

ответ

2

makePSOCKCluster, или в более общем makeCluster, можно повесить на любое количество причин, при создании так называемых worker процессов, которая включает в себя запуск новых сеансов R с помощью Rscript команда, которая будет выполнять функцию .slaveRSOCK, которая будет создавать соединение сокета обратно к ведущему, а затем выполнить функцию slaveLoop, где она в конечном итоге выполнит задачи, отправленные им мастером. Wehen что-то пошло не так, когда вы запускаете любой из рабочих процессов, мастер будет висеть во время выполнения socketConnection, ожидая, когда рабочий подключится к нему, даже несмотря на то, что этот рабочий, возможно, умер или даже не был успешно создан.

Использование аргумента outfile отлично, потому что оно часто обнаруживает ошибку, из-за которой рабочий процесс умирает и, следовательно, хозяин висит. Но если это ничего не показывает, перейдите в ручной режим. В ручном режиме мастер печатает команду для запуска каждого рабочего вместо выполнения самой команды. Это больше работает, но дает вам полный контроль, и вы можете даже отлаживать работу, если вам нужно.

Вот пример:

> library(parallel) 

> cl <- makePSOCKcluster(1, manual=TRUE, outfile='log.txt') 
Manually start worker on localhost with 
    '/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=localhost 
PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE 

Затем откройте новое окно терминала (командной строки, или любой другой), и вставьте в этой Rscript команды. Как только вы его выполнили, makePSOCKcluster должен вернуться, так как мы запросили только одного работника. Конечно, если что-то пойдет не так, оно не вернется, но если вам повезет, вы получите сообщение об ошибке в окне терминала, и у вас будет важный ключ, который, надеюсь, приведет к решению вашей проблемы , Если вам не повезет, команда Rscript также будет висеть, и вам придется погрузиться еще глубже.

Чтобы отладить работника, вы не выполняете отображаемую команду Rscript, потому что вам нужен интерактивный сеанс. Вместо этого, вы начинаете R сессии с помощью команды, например:

$ R --vanilla --args MASTER = локальный PORT = 10187 OUT = log.txt Timeout = 2592000 МЕТОДЫ = ИСТИНА XDR = TRUE

В этом сеансе R вы можете установить точку останова на.Функция slaveRSOCK и затем выполнить его:

> debug(parallel:::.slaveRSOCK) 
> parallel:::.slaveRSOCK() 

Теперь вы можете начать пошаговое выполнение кода, возможно, установка точек останова на функции slaveLoop и makeSOCKmaster.

+0

У меня была та же проблема, и подсказка ', которая включает в себя запуск новых сеансов R с использованием команды Rscript', была очень полезна. Если у R возникли проблемы с запуском (например, недоступный сетевой диск, ошибка в файле .Rsite), это приведет к тому, что makePSOCKcluster будет зависать при создании кластеров. В моем случае R висела почти незаметно из-за сетевой проблемы; после удаления неправильного сетевого пути я мог бы без проблем использовать makePSOCKcluster. – tomka