从文档中运行doRedis示例时,TryCatch和名称出错

时间:2014-08-06 05:10:17

标签: r parallel-processing redis cluster-computing r-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 个答案:

答案 0 :(得分:1)

你的例子的一个问题是你没有在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服务器的版本时,似乎会出现真正的问题。我认为当解析服务器的“INFO”输出导致worker失败时redisInfo出现错误。我的猜测是,当你安装了一个不同的redis服务器时,它改变了“INFO”输出,它不再触发redisInfo中的bug,从而“修复”了这个问题。希望可以改进redisInfo函数,以便不再发生此错误。

答案 1 :(得分:0)

我想我发现了这个问题。我用brew来安装redis-server。我重新安装了没有brew的redis-server,并在配置文件中将timeout设置为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时出错。