1

我正在尝试使用 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]`

任何人有任何想法如何解决这个问题?

4

2 回答 2

1

您的示例的一个问题是您没有在 foreach 循环的主体周围使用花括号。因为%dopar%and%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 worker调用redisInfo函数判断redis服务器版本的时候。我认为解析服务器的“INFO”输出时出现错误redisInfo,导致工作人员失败。我的猜测是,当您安装不同的 redis 服务器时,它更改了“INFO”输出,不再触发 redisInfo 中的错误,从而“修复”了问题。希望redisInfo功能可以改进,以免再次出现此错误。

于 2014-08-06T13:00:47.717 回答
0

我想我找到了问题所在。我使用 brew 来安装 redis-server。我在没有 brew 的情况下重新安装了 redis-server,并在配置文件中将超时设置为 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 的方式存在错误。

于 2014-08-06T18:08:07.977 回答