【问题标题】:different results using %dopar% and %do%使用 %dopar% 和 %do% 的不同结果
【发布时间】:2019-12-26 09:09:46
【问题描述】:

我正在尝试使用%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%?

提前致谢,

【问题讨论】:

标签: r parallel-processing


【解决方案1】:

并行循环中的计算是在它自己的实例中进行的。您正在尝试分配给 foreach 无权访问的全局。试试这个:

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

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 2016-05-20
    • 2013-06-13
    • 2015-02-27
    • 2011-11-06
    • 2019-04-12
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多