R';s parallel foreach是否在同一子操作中为其他迭代保存对象?
我使用R中的doParallel/Foreach后端并行运行一个进程。我将一组20个内核注册为一个集群,并运行该进程大约100次。我将一个矩阵传递给并行过程的每个迭代,在子过程中,我将矩阵替换为其自身行的随机样本。我想知道的是:我是否应该期望这种修改会持续到由同一子进程处理的后续迭代中?例如,当子流程1完成其第一次迭代时,它是使用原始矩阵还是随机样本开始第二次迭代 一个简单的例子: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)
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)
库(双并行)
要清楚,我不想每次都修改对象。相反,我担心这可能会毫无意义地发生,导致错误。我的问题在这一点上不是很清楚;我会修好的。