Ответ 1
В соответствии с https://twitter.com/cboettig/status/588068454239830017 эта функция пока не поддерживается.
Я пытаюсь выяснить, как развернуть функцию 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
Я ожидаю, что это будет 3, если вызов do был разделен между двумя ядрами. Я также могу подтвердить это, добавив печать в do(), которая печатает на основном R-терминале. Что мне здесь не хватает?
Я использую dplyr 0.4.2 с R 3.2.1
В соответствии с https://twitter.com/cboettig/status/588068454239830017 эта функция пока не поддерживается.
Как упоминалось в @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
Вы можете проверить новый пакет Hadley multidplyr
.