TryCatch и names Ошибка при запуске примеров doRedis из документации
Я пытаюсь использовать doRedis для создания кластера R и параллельной обработки некоторых моих вычислений с помощью foreach, но продолжаю сталкиваться с ошибками. Мой код работает с foreach %do%, но когда я пытаюсь запустить кластер с%dopar%, он не работает. Я также попытался запустить пример кода в документации doRedis, который также не работает. Ниже приведена консоль R моего основного скрипта и рабочего:
Основная консоль R:
> require('doRedis')
> registerDoRedis('work')
> getDoParWorkers()
[1] 2
> foreach(j=1:10,.combine=sum,.multicombine=TRUE) %dopar%
+ 4*sum((runif(1000000)^2 + runif(1000000)^2)<1)/10000000
[1] "interrupt: \n"
Error in tryCatchOne(expr, names, parentenv, handlers[[1L]]) :
attempt to apply non-function
In addition: Warning message:
In e$fun(obj, substitute(ex), parent.frame(), e$data) :
Queue length off by 10...correcting
Рабочая консоль:
> require('doRedis')
> redisWorker('work')
Waiting for doRedis jobs.
Processing job 3 from queue work
Error in names(z) <- w[o] :
'names' attribute [69] must be the same length as the vector [68]
Я не уверен, что вызывает ошибки, но кажется, что все, что я посылаю работнику, приводит к этой ошибке:
`Error in names(z) <- w[o] :
'names' attribute [69] must be the same length as the vector [68]`
У кого-нибудь есть идеи как это исправить?
2 ответа
Одна из проблем вашего примера заключается в том, что вы не используете фигурные скобки вокруг тела цикла foreach. Так как %dopar%
а также %do%
бинарные операторы, вы должны быть уверены, что все тело цикла foreach рассматривается как правильный аргумент %dopar%
оператор. В вашем случае тело цикла foreach просто 4
, Используя фигурные скобки (или скобки), вы можете решить эту проблему:
foreach(j=1:10,.combine=sum,.multicombine=TRUE) %dopar% {
4*sum((runif(1000000)^2 + runif(1000000)^2)<1)/10000000
}
Но настоящая проблема возникает, когда работник Redis вызывает redisInfo
Функция для определения версии сервера Redis. Я думаю, что есть ошибка в redisInfo
когда анализируется вывод "INFO" с сервера, что приводит к сбою работника. Я предполагаю, что когда вы установили другой сервер Redis, он изменил вывод "INFO", который больше не вызывал ошибку в redisInfo, таким образом "исправляя" проблему. Надеюсь, что redisInfo
Функция может быть улучшена, чтобы эта ошибка больше не возникала.
Я думаю, что нашел проблему. Я использовал brew для установки redis-сервера. Я переустановил redis-сервер без brew и установил таймаут на 0 в файле конфигурации. Теперь, когда я запускаю работу, рабочие выводят:
`Waiting for doRedis jobs.
Processing job 3 from queue works
Processing task 10 ... from queue works jobID 3
Processing job 3 from queue works
Processing task 100 ... from queue works jobID 3
Processing job 3 from queue works
Processing task 13 ... from queue works jobID 3
Processing job 3 from queue works
Processing task 14 ... from queue works jobID 3
Processing job 3 from queue works
Processing task 16 ... from queue works jobID 3
Processing job 3 from queue works
Processing task 18 ... from queue works jobID 3
Processing job 3 from queue works
Processing task 2 ... from queue works jobID 3
Processing job 3 from queue works
Processing task 21 ... from queue works jobID 3
[1] "Empty"`
Я получаю пустую строку, но думаю, что это связано с ошибкой в том, как я написал свою функцию и передал ее в foreach.