如何使用dplyr并行化do()调用

如何使用dplyr并行化do()调用,r,dplyr,R,Dplyr,我试图弄清楚如何并行部署dplyr::do函数。在阅读了一些文档之后,似乎dplyr::init_cluster()足以告诉do()并行运行。不幸的是,当我测试时,情况似乎并非如此: library(dplyr) test <- data_frame(a=1:3, b=letters[c(1:2, 1)]) init_cluster() system.time({ test %>% group_by(b) %>% do({ Sys.sleep(

我试图弄清楚如何并行部署
dplyr::do
函数。在阅读了一些文档之后,似乎dplyr::init_cluster()足以告诉do()并行运行。不幸的是,当我测试时,情况似乎并非如此:

library(dplyr)
test <- data_frame(a=1:3, b=letters[c(1:2, 1)])

init_cluster()
system.time({
  test %>%
    group_by(b) %>%
    do({
      Sys.sleep(3)
      data_frame(c = rep(max(.$a), times = max(.$a)))
    })
})
stop_cluster()
如果do调用在两个内核之间进行拆分,我希望是3。我还可以通过在主R终端中打印的do()中添加一个打印来确认这一点。我错过了什么


我正在将dplyr 0.4.2与R 3.2.1一起使用,因为目前似乎不支持此功能

您可以查看哈德利的新软件包。

根据@Maciej提到的,您可以尝试
multidplyr

## Install from github
devtools::install_github("hadley/multidplyr")

使用
partition()

library(dplyr)
library(multidplyr)
test <- data_frame(a=1:3, b=letters[c(1:2, 1)])
test1 <- partition(test, a)
然后只需执行
do()
调用:

test1 %>%
  do({
    dplyr::data_frame(c = rep(max(.$a)), times = max(.$a))
  })
其中:

#Source: party_df [3 x 3]
#Groups: a
#Shards: 3 [1--1 rows]
#
#      a     c times
#  (int) (int) (int)
#1     1     1     1
#2     2     2     2
#3     3     3     3

我发现,对于真正关键的代码,最好的方法,至少对于我的用例来说,是用Rcpp和OpenMP弄脏你的手。这在很大程度上超出了我的计算机科学能力,但似乎有太多微妙的缓存交互,有时还有处理器或编译器的怪癖,所以需要仔细地分析和基准测试。我还发现,对数据进行良好的结构化通常会产生最大的差异,并且可以显著地帮助并行化。祝你好运谢谢研究了@Maciej的答案,很高兴终于找到了答案。我经常做比Summary中可用的任务更复杂的任务,如果没有并行化,我就无法真正找到像许多人声称的那样有用的dplyr。@MaxGordon很高兴它有帮助!如何将要使用
do()
执行的用户定义函数发送到每个节点?我得到了“未找到函数”@Dominik你介意用一个可复制的例子发布一个新问题吗?我可以给它一个快照,如果您手动创建集群,看起来您可以使用parallel的clusterExport使用通常的方法来实现这一点:集群
test1 %>%
  do({
    dplyr::data_frame(c = rep(max(.$a)), times = max(.$a))
  })
#Source: party_df [3 x 3]
#Groups: a
#Shards: 3 [1--1 rows]
#
#      a     c times
#  (int) (int) (int)
#1     1     1     1
#2     2     2     2
#3     3     3     3