我应该做些什么改变才能获得可重复的结果?我多次运行它,结果向量不同。谢谢你的帮助。
cl <- makeCluster(2)
registerDoParallel(2)
set.seed(123)
results <- unlist(llply(seq_along(1:4), .fun = function(x){
runif(1)} ,.parallel = T,
.paropts = list(.export=ls(.GlobalEnv))))
stopCluster(cl)
答案 0 :(得分:3)
以下示例将在Linux,Mac OS X和Windows上提供可重现的结果:
library(plyr)
library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
opts <- list(preschedule=TRUE)
clusterSetRNGStream(cl, 123)
r <- llply(1:20,
.fun = function(x) runif(10),
.parallel = TRUE,
.paropts = list(.options.snow=opts))
需要使用preschedule=TRUE
选项来防止doParallel使用负载平衡,这会使任务映射到工作者不可预测。
如果您正在使用Linux或Mac OS X,并且希望doParallel使用mclapply
,则可以使用此方法:
if (.Platform$OS.type != "windows") {
registerDoParallel(2)
RNGkind("L'Ecuyer-CMRG")
set.seed(123)
mc.reset.stream()
r <- llply(1:20,
.fun = function(x) runif(10),
.parallel = TRUE)
}
这是有效的,因为mclapply
默认使用预调度。它不能在Windows上工作,因为doParallel将隐式创建一个集群对象,并且RNG初始化不会产生任何影响。
请注意,在您的示例中,您正在创建群集对象但未注册它,因此doParallel将不会使用它。您必须使用registerDoParallel(cl)
,否则doParallel将在Posix计算机上使用mclapply
或在Windows计算机上使用隐式创建的群集对象。显然,初始化将实际执行并行计算的集群工作人员非常重要。