并行化不适用于 foreach 包

Posted

技术标签:

【中文标题】并行化不适用于 foreach 包【英文标题】:Parallelization doesn't work with the foreach package 【发布时间】:2015-08-21 16:32:54 【问题描述】:

使用 foreach 包,我预计以下行将在大约 10 秒内运行

system.time(foreach (i=1:5, .combine='c') %do% Sys.sleep(2);i)
   user  system elapsed 
  0.053   0.011  10.012 

接下来的代码运行大约需要 2 秒

system.time(foreach (i=1:5, .combine='c') %dopar% Sys.sleep(2);i)
   user  system elapsed 
  0.069   0.017  10.019 

但它不起作用。

我在 Mac OSX 上,我的机器有 16 个处理器,目前没有运行任何重物。我没有收到任何错误或警告消息。

【问题讨论】:

这里似乎没有什么可以并行化的。您的 for 循环声明所有五个循环都连续运行。 我觉得我误解了vignette。我认为使用 %dopar% 会导致 foreach 循环中的任何内容针对i 的每个值并行运行。在第 8 页的第一段中,您可以阅读:To make any of the previous examples run in parallel, all you have to do is to replace %do% with %dopar%。我的错误是什么? 您是否收到警告消息:“按顺序执行 %dopar%:未注册并行后端”? 【参考方案1】:

您需要注册一个并行后端。做类似的事情

library(doParallel)
registerDoParallel(cores=4)

【讨论】:

以上是关于并行化不适用于 foreach 包的主要内容,如果未能解决你的问题,请参考以下文章

与 Rborist 并行化

并行化特征工具 dfs

如何并行化 R 中包的函数

在一组不同的解释变量上并行化 R 中的面板 logit 计算

使用降雪包并行化 R 代码

R中的并行化“查找”循环