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

How to parallelelize do() calls with 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()

给出此输出:

Initialising 2 core cluster.
|==========================================================================|100% ~0 s remaining
   user  system elapsed 
   0.03    0.00    6.03 

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

我正在使用 dplyr 0.4.2 和 R 3.2.1

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

你可以查看 Hadley 的新包 multidplyr

正如@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)

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

# Initialising 3 core cluster.

然后只需执行您的 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