我正在尝试使用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]`
任何人都有任何想法如何解决这个问题?
答案 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时出错。