运行 doRedis- 即使已导出对象也未找到

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

我正在测试 doRedis 包,方法是在一台机器上运行一个 worker,在另一台机器上运行 master/server。我的主人的代码是这样的:

 #Register ...
 r <- foreach(a=1:numreps, .export(...)) %dopar% {
        train <- func1(..)

        best <- func2(...)

        weights <- func3(...)

        return ...
      }

在每个函数中,都会访问一个全局变量,但不会对其进行修改。我已经在 foreach 循环的 .export 部分中导出了全局变量,但是每当我运行代码时,都会发生错误,指出未找到该变量。有趣的是,当我所有的 worker 都在一台机器上时,代码可以工作,但当我有一个“外部” worker 时,代码就会崩溃。知道为什么会发生此错误,以及如何更正错误吗?

谢谢!

更新:我这里有一些代码的要点:https://gist.github.com/liangricha/fbf29094474b67333c3b

更新 2:我问了另一个与 doRedis 相关的问题:“是否可以让每台工作机器利用其所有核心?

@Steve Weston 回应:“每个核心启动一个 Redis worker 通常会充分利用一台机器。”

最佳答案

这种代码在过去是 doParallel、doSNOW 和 doMPI 包的问题,​​但在过去一年左右的时间里它们得到了改进以更好地处理它。问题是变量被导出到一个特殊的“导出”环境,不是到全局环境。这在各种方面都是可取的,但这意味着后端必须做更多的工作,以便导出的变量在导出函数的范围内。 doRedis 似乎尚未更新以使用这些改进。

下面是一个简单的例子来说明这个问题:

library(doRedis)
registerDoRedis('jobs')
startLocalWorkers(3, 'jobs')
glob <- 6
f1 <- function() {
  glob
}
f2 <- function() {
  foreach(1:3, .export=c('f1', 'glob')) %dopar% {
    f1()
  }
}

f2()  # fails with the error: "object 'glob' not found"

如果使用 doParallel 后端,则成功:

library(doParallel)
cl <- makePSOCKcluster(3)
registerDoParallel(cl)

f2()  # works with doParallel

一种解决方法是在函数“f2”内部定义函数“f1”:

f2 <- function() {
  f1 <- function() {
    glob
  }
  foreach(1:3, .export=c('glob')) %dopar% {
    f1()
  }
}

f2()  # works with doParallel and doRedis

另一种解决方案是使用某种机制将变量导出到每个 worker 的全局环境中。使用 doParallel 或 doSNOW,您可以使用 clusterExport 函数执行此操作,但我不确定如何使用 doRedis 执行此操作。

我会将此问题报告给 doRedis 包的作者,并建议他更新 doRedis 以处理导出的函数,如 doParallel。

关于运行 doRedis- 即使已导出对象也未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22721545/

相关文章:

selenium - 使用gradle,testNG不能高效地并行调度测试

redis - celery :让 worker 每秒执行x个任务

R:原始函数 - 出于历史或效率原因?

r - 将 ggpredict() 和 ggplot2() 与缩放的连续变量一起使用并尝试取消缩放它们

list - 防止 unlist 删除 NULL 值

R中的回归树

multithreading - 计算平方和的最并行算法?

c# - 为什么暂停/中止线程不好?

java - 为什么我的项目中EhCache还在下载和初始化

memory - 在 Redis 中批量设置哈希