正在运行doRedis-即使在';它已经出口了

正在运行doRedis-即使在';它已经出口了,r,parallel-processing,redis,cluster-computing,r-doredis,R,Parallel Processing,Redis,Cluster Computing,R Doredis,我通过在一台机器上运行worker,在另一台机器上运行master/server来测试doRedis包。我的主机上的代码如下所示: #Register ... r <- foreach(a=1:numreps, .export(...)) %dopar% { train <- func1(..) best <- func2(...) weights <- func3(...) return ...

我通过在一台机器上运行worker,在另一台机器上运行master/server来测试doRedis包。我的主机上的代码如下所示:

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

        best <- func2(...)

        weights <- func3(...)

        return ...
      }
#寄存器。。。

r这种代码在过去对于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"
库(doRedis)
registerDoRedis(‘作业’)
惊人的员工(3个“工作”)

我想我们需要更多的代码。也许是要点中一些扩展片段的链接?嗨!很抱歉,反应太晚。我在这里上传了一个要点:。并行化发生在“howmanypulses”函数中,“parttable”全局变量的访问发生在“createdataset”函数中。根据doRedis的日志,前300个作业运行良好,但程序在第一批300个作业之后崩溃,并声明找不到对象“parttable1”。对诊断此问题的任何帮助都将非常有用。非常感谢@liangricha每个核心启动一个redis worker通常会充分利用一台机器。再次感谢您的帮助!由于一个小的语法错误,删除了我的原始评论,但在后续操作中更新了我的问题。与clusterExport()等效的doRedis是setExport()函数
library(doParallel)
cl <- makePSOCKcluster(3)
registerDoParallel(cl)

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

f2()  # works with doParallel and doRedis