如何使用 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
我正在尝试弄清楚如何并行部署 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