我正在试图弄清楚如何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)