はじめに
前に
hoxo-m/pforeach
パッケージを利用して,
ggplot
のリストを並列処理し,描写の高速化を行いました.
しかし, hoxo-m/pforeach
パッケージの霊圧が消えてしまったので,
furrr
パッケージを試してみることにしました.
https://github.com/DavisVaughan/furrr
furrr
パッケージは purrr
パッケージと似た感覚で操作でき,事前に plan(multiprocess)
としておくだけで並列化してくれる化け物.関数名も future_map
など, purrr
パッケージの関数名に future_
という prefix がつくだけで覚えやすい.
plan(sequential)
すれば並列化を解除できます.
multiprocess
や sequential
以外にも様々な strategy
が選べますが,詳しくは, ?future::plan
を見ましょう.
実装とテスト
前回 pforeach::pforeach()
関数を用いて実装した print_gglist()
を
furrr::future_map()
を用いて再実装しました.
strategy
引数と ...
引数で plan()
をコントロールできます.
library(pacman)
p_load(furrr, ggplot2, grid, magrittr, purrr)
print_gglist <- function(x, strategy = multiprocess, ...) {
current_plan <- plan()
plan(strategy, ...)
future_map(x, ~ ggplot_gtable(ggplot_build(.x))) %>%
walk(function(x) { # 順次出力
grid.newpage()
grid.draw(x)
})
plan(current_plan)
invisible(x)
}
g <- ggplot(iris, aes(Sepal.Length)) + geom_histogram()
print_gglist(list(g, g))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ベンチマーク
p_load(microbenchmark)
g_list <- rep(list(g), 10)
bench <- microbenchmark(
'single thread' = walk(g_list, print),
'multi thread' = print_gglist(g_list)
)
bench
plot(bench)
## Unit: milliseconds
## expr min lq mean median uq max neval
## single thread 774.9664 846.9223 911.0551 896.0701 952.7812 1303.653 100
## multi thread 572.6841 610.1190 667.7990 643.0180 693.4269 1216.081 100
うまくいきましたね!!
感想
furrr
パッケージは簡単,便利!!