R:并行地完全可重现的结果

时间:2016-01-22 11:57:26

标签: r parallel-processing plyr

我应该做些什么改变才能获得可重复的结果?我多次运行它,结果向量不同。谢谢你的帮助。

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)

1 个答案:

答案 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计算机上使用隐式创建的群集对象。显然,初始化将实际执行并行计算的集群工作人员非常重要。