R';s parallel foreach是否在同一子操作中为其他迭代保存对象?

R';s parallel foreach是否在同一子操作中为其他迭代保存对象?,r,parallel-processing,parallel-foreach,R,Parallel Processing,Parallel Foreach,我使用R中的doParallel/Foreach后端并行运行一个进程。我将一组20个内核注册为一个集群,并运行该进程大约100次。我将一个矩阵传递给并行过程的每个迭代,在子过程中,我将矩阵替换为其自身行的随机样本。我想知道的是:我是否应该期望这种修改会持续到由同一子进程处理的后续迭代中?例如,当子流程1完成其第一次迭代时,它是使用原始矩阵还是随机样本开始第二次迭代 一个简单的例子: library(doParallel) X <- matrix(1:400, ncol=4)

我使用R中的doParallel/Foreach后端并行运行一个进程。我将一组20个内核注册为一个集群,并运行该进程大约100次。我将一个矩阵传递给并行过程的每个迭代,在子过程中,我将矩阵替换为其自身行的随机样本。我想知道的是:我是否应该期望这种修改会持续到由同一子进程处理的后续迭代中?例如,当子流程1完成其第一次迭代时,它是使用原始矩阵还是随机样本开始第二次迭代

一个简单的例子:

   library(doParallel)

   X <- matrix(1:400, ncol=4)

   cl<-makeCluster(2)
   clusterExport(X)
   registerDoParallel(cl)


   results<-foreach(i=1:100) %dopar% {
       set.seed(12345)
       X <- X[sample.int(nrow(X),replace=TRUE),]
       X
   }
库(双并行)

X集群工作进程中的副作用可能会在foreach循环的迭代中持续存在,但这不是foreach支持的特性。利用它的程序可能无法移植到不同的并行后端,并且可能无法与较新版本的软件一起工作。事实上,当我第一次写foreach的时候,我试图让这种副作用变得不可能,但最终我放弃了

请注意,在本例中,您并没有修改显式导出到辅助对象的
X
副本:您正在修改通过doParallel自动导出到辅助对象的副本。这可能是你困惑的根源

如果您真的想这样做,我建议您关闭自动导出
X
,然后修改显式导出的副本,这样程序应该定义良好且可移植,尽管有点难看。下面是一个例子:

library(doParallel)
cl <- makePSOCKcluster(2)
registerDoParallel(cl)
X <- matrix(0, nrow=4, ncol=4)
clusterExport(cl, 'X')
ignore <- clusterApply(cl, seq_along(cl), function(i) ID <<- i)
results <-
  foreach(i=1:4, .noexport='X') %dopar% {
    X[i,] <<- ID
    X
  }
finalresults <- clusterEvalQ(cl, X)
库(双并行)
要清楚,我不想每次都修改对象。相反,我担心这可能会毫无意义地发生,导致错误。我的问题在这一点上不是很清楚;我会修好的。