1

dopar我在注册时遇到了在函数内部运行的问题doRNG,我需要访问在函数内部创建的变量。

我在这里的总体目标是用来doRNG确保我的并行进程获得不同的随机数流,所以如果有更好的方法来做到这一点,这也将解决我的问题。

其次,我对使用doRNG失败的原因感兴趣,因为我试图了解环境如何导出到并行进程。

这里的代码看起来有点做作,但这是对更大更复杂的代码的总结。

library(doParallel)
library(foreach)

cl <- makePSOCKcluster(2)
registerDoParallel(cl)

#if I comment out these two lines, code runs fine
library(doRNG)
registerDoRNG()

gVar <- 'gVar'

cols <- matrix(1:10,nrow=2)
res <- apply(cols,2, 
  function(col) {
    lclVar <- sum(col)

    res <- foreach(i=icount(2),
     .export=c('gVar'), #'lclVar'
     .combine='c') %dopar% { #change to %do% also works
       return(sprintf('%s %s %s',gVar,lclVar,i))
     }

    return(res)
})

print(res)
stopCluster(cl)

请注意,如果我注释掉这些doRNG行,代码运行良好。也从%dopar%to更改为%do%(并保留doRNG未注释的行)作品。

我得到以下信息:

Error in { : task 1 failed - "object 'lclVar' not found"
4

1 回答 1

0

我在这里的总体目标是使用 doRNG 来确保我的并行进程获得不同的随机数流,所以如果有更好的方法来做到这一点,这也将解决我的问题。

如果您可以将问题“改写”为lapply()电话,那么

y <- future_lapply(x, FUN, ..., future.seed = TRUE)

未来的软件包(我是作者)将确保每次FUN(x[[i]], ...)调用都使用正确的(L'Ecuyer-CMRG)RNG 流完成。future 包还会自动处理全局变量(例如gVarlclVar)被正确导出到每个工作人员。

您可以控制如何与plan()函数并行化,例如

cl <- makePSOCKcluster(2)
plan(cluster, workers = cl)

这相当于:

plan(multiprocess, workers = 2L)

这在所有操作系统上都一样。

于 2017-05-16T20:36:36.723 回答