我正在尝试使用%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%?
谢谢,
答案 0 :(得分:2)
并行循环中的计算在其自己的实例中。您正在尝试分配给foreach无法访问的全局变量。试试这个:
cl <- parallel::makeForkCluster(4)
doParallel::registerDoParallel(cl)
junk_parallel <- foreach(i=seq(0,10000,1)) %dopar% {
sqrt(i)}
stopCluster(cl)