使用%dopar%和%do%获得不同的结果

时间:2019-08-21 06:32:46

标签: r parallel-processing

我正在尝试使用%dopar%通过并行化多个内核来加快for循环。但是,我无法存储返回的值。这是一个可重现的小示例。

使用%dopar%

cl <- parallel::makeForkCluster(4)
doParallel::registerDoParallel(cl)
junk_parallel = seq(0,100000,1)
system.time(foreach(i=seq(0,10000,1))%dopar%{
  junk_parallel[i] = sqrt(i)})
stopCluster(cl)

输出:

user  system elapsed 
  2.536   0.148   2.690 
> junk_parallel[9]
[1] 8

使用%do%

cl <- parallel::makeForkCluster(4)
doParallel::registerDoParallel(cl)
junk_parallel = seq(0,100000,1)
system.time(foreach(i=seq(0,10000,1))%do%{
  junk_parallel[i] = sqrt(i)}) 
stopcluster(cl)

输出:

 user  system elapsed 
  2.172   0.004   2.174 
> junk_parallel[9]
[1] 3 

为什么%dopar%无法分配正确的值?何时使用%dopar%和%do%?

谢谢,

1 个答案:

答案 0 :(得分:2)

并行循环中的计算在其自己的实例中。您正在尝试分配给foreach无法访问的全局变量。试试这个:

cl <- parallel::makeForkCluster(4)
doParallel::registerDoParallel(cl)
junk_parallel <- foreach(i=seq(0,10000,1)) %dopar% {
  sqrt(i)}
stopCluster(cl)