gpt4 book ai didi

r - 运行文档中的 doRedis 示例时出现 TryCatch 和名称错误

转载 作者:IT王子 更新时间:2023-10-29 06:15:01 25 4
gpt4 key购买 nike

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

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

最佳答案

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

关于r - 运行文档中的 doRedis 示例时出现 TryCatch 和名称错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25152655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com