【问题标题】:TryCatch and names Error when running doRedis examples from documentation运行文档中的 doRedis 示例时出现 TryCatch 和名称错误
【发布时间】:2014-08-06 05:10:16
【问题描述】:

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

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: r parallel-processing redis cluster-computing r-doredis


    【解决方案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 worker调用redisInfo函数来判断redis服务器的版本的时候。我认为 redisInfo 在解析来自服务器的“INFO”输出时出现错误,导致工作人员失败。我的猜测是,当您安装不同的 redis 服务器时,它更改了“INFO”输出,不再触发 redisInfo 中的错误,从而“修复”了问题。希望redisInfo功能可以改进,让这个错误不再发生。

    【讨论】:

    • 我用 {} 厌倦了它,但仍然得到相同的错误:名称错误(z)
    • @NathanWadhwani 问题可能是由 doRedis 中的错误引起的。你用的是什么版本的doRedis和rredis?
    • doRedis:1.1.1 和 rredis:1.6.8。我在带有 brew 的 Mac 上安装了 redis,并认为这就是问题所在。我想我通过在没有 brew 的 osx 上安装 redis 并在 redis 配置文件中将超时设置为 0 来修复它。
    • 这很可能是问题的原因。据报道并提出了一些补丁:github.com/bwlewis/doRedis/issues/10虽然我无法编译它
    • 这似乎已在新发布的 rredis 1.6.9 中得到修复。(可能包括提到的补丁,因此不再需要 custom builds。)
    【解决方案2】:

    我想我找到了问题所在。我使用 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 的方式存在错误。

    【讨论】:

      猜你喜欢
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多