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

Max*_*don 19 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(3)
      data_frame(c = rep(max(.$a), times = max(.$a)))
    })
})
stop_cluster()
Run Code Online (Sandbox Code Playgroud)

给出这个输出:

Initialising 2 core cluster.
|==========================================================================|100% ~0 s remaining
   user  system elapsed 
   0.03    0.00    6.03 
Run Code Online (Sandbox Code Playgroud)

如果do调用在两个内核之间分配,我希望它是3.我还可以通过在主R-端子中打印的do()添加打印来确认这一点.我在这里错过了什么?

我正在使用dplyr 0.4.2和R 3.2.1

Ste*_*pré 24

正如@Maciej所提到的,你可以试试multidplyr:

## Install from github
devtools::install_github("hadley/multidplyr")
Run Code Online (Sandbox Code Playgroud)

用于partition()在多个核心之间拆分数据集:

library(dplyr)
library(multidplyr)
test <- data_frame(a=1:3, b=letters[c(1:2, 1)])
test1 <- partition(test, a)
Run Code Online (Sandbox Code Playgroud)

您将初始化3核群集(每个群集一个a)

# Initialising 3 core cluster.
Run Code Online (Sandbox Code Playgroud)

然后只需执行您的do()通话:

test1 %>%
  do({
    dplyr::data_frame(c = rep(max(.$a)), times = max(.$a))
  })
Run Code Online (Sandbox Code Playgroud)

这使:

#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
Run Code Online (Sandbox Code Playgroud)

  • 如果您手动创建集群,看起来可以通过parallel的clusterExport以常规方式执行此操作:cluster < - create_cluster(4); clusterExport(簇,C( "userfun1", "userfun2", "userfun3")) (4认同)
  • 谢谢!看看@Maciej的答案,这终于到来了,真是太棒了.我经常做比总结中更复杂的任务,没有并行化我无法真正找到dplyr那么有用,就像许多人声称的那样. (2认同)

Mac*_*iej 8

您可以查看Hadley的新包装multidplyr.


小智 5

根据https://twitter.com/cboetig/status/588068454239830017目前似乎不支持此功能。