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.

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