【发布时间】: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%?
提前致谢,
【问题讨论】:
-
@Roland:我已阅读,但无法在小插图中找到答案。为了后代,关于如何使用 %dopar% 存储值的另一个详细答案是stackoverflow.com/questions/19791609/…
-
你可能读过,但你不明白。这些小插曲不显示任何具有副作用的循环(例如分配到循环外的对象)。
foreach更类似于lapply,而不是for循环。 -
@Roland:谢谢,我会记住的..
-
您可以查看privefl.github.io/blog/a-guide-to-parallelism-in-r 以了解有关 foreach 及其常见问题(包括您的问题)的更多信息。
标签: r parallel-processing