Как выполнять параллельные вызовы do() с помощью 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 

Я ожидаю, что это будет 3, если вызов do был разделен между двумя ядрами. Я также могу подтвердить это, добавив печать в do(), которая печатает на основном R-терминале. Что мне здесь не хватает?

Я использую dplyr 0.4.2 с R 3.2.1

Ответы

Ответ 2

Как упоминалось в @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

Ответ 3

Вы можете проверить новый пакет Hadley multidplyr.