vroomパッケージを使ってみる
これはなに
データ読み込み系のパッケージで新しいのが出現したので、ちょっと触ってみた記録です。 2019年5月にリリースされたばかりのほやほやパッケージ。
vroomパッケージ
GitHubのレポジトリには
The fastest delimited reader for R
とあります。Rで区切り値のファイルを読み込むのに最速だぜということらしいです。
特徴
readr::read_***()
になくて vroom::vroom()
にある機能をGitHubから引用すると、およそ以下のような感じです。
- 区切り値判定
- マルチバイト、Unicodeの区切り値に対応
- 読み込む時点でほしい列を選択できる 。
dplyr::select()
っぽい書き方ができる。 - 複数のファイルを読み込んで連結できる
- robust to invalid inputs. vroom has been extensively tested with the afl fuzz tester).
は
data.table::fread()
にはあったけどreadr::read_***()
にはなかったやつ。もちろん区切り値は自分で指定できます(delim
引数)。は地味に嬉しいかな?まあマルチバイトの区切り値のファイルなんて闇なので触れたくないですが。
は
%>% select()
しなくていいよってことだと思うけどあんまりメリットを感じない... 例:vroom("mtcars.tsv", col_select = c(model, cyl, gear))
は
files
みたいなオブジェクトにファイル一覧が格納されてるときにこれまではpurrr::map_dfr(files, readr::read_csv)
みたいにやってたのをvroom(files)
で一発でできるよってやつ。お手軽にできるのは嬉しい...のか?多分人による。はよくわかりません。要調査。
速度比較
使うファイル
以前僕が作った以下のレポジトリの csv/Sales.csv
を使います。100万行3列で44.7MB。
コード
file <- '~/Desktop/SampleData/csv/Sales.csv' compare <- microbenchmark::microbenchmark('utils::read.csv' = read.csv(file), 'readr::read_csv' = readr::read_csv(file), 'data.table::fread' = data.table::fread(file), 'vroom::vroom' = vroom::vroom(file), times = 100 ) microbenchmark:::autoplot.microbenchmark(compare) compare # ブログ用出力 # knitr::kable(microbenchmark:::print.microbenchmark(compare))
結果
expr | min | lq | mean | median | uq | max | neval |
---|---|---|---|---|---|---|---|
utils::read.csv | 2093.1755 | 2485.1532 | 2627.8076 | 2600.6724 | 2739.7046 | 3295.7278 | 100 |
readr::read_csv | 575.3615 | 888.1022 | 951.2239 | 942.5396 | 1015.6063 | 1301.9164 | 100 |
data.table::fread | 583.1836 | 652.6877 | 685.3652 | 668.7719 | 704.3427 | 1030.3711 | 100 |
vroom::vroom | 210.2168 | 228.2509 | 250.5716 | 234.7870 | 245.4312 | 592.4736 | 100 |
vroomの圧勝でした。
実行環境
> devtools::session_info() ─ Session info ────────────────────────────────────────────────────────── setting value version R version 3.6.0 (2019-04-26) os macOS Mojave 10.14.4 system x86_64, darwin15.6.0 ui RStudio language (EN) collate C ctype en_US.UTF-8 tz Asia/Tokyo date 2019-05-17 ─ Packages ────────────────────────────────────────────────────────────── package * version date lib source assertthat 0.2.1 2019-03-21 [1] CRAN (R 3.6.0) backports 1.1.4 2019-04-10 [1] CRAN (R 3.6.0) broom 0.5.1 2018-12-05 [1] CRAN (R 3.5.0) callr 3.2.0 2019-03-15 [1] CRAN (R 3.6.0) cellranger 1.1.0 2016-07-27 [1] CRAN (R 3.6.0) cli 1.1.0 2019-03-19 [1] CRAN (R 3.6.0) colorspace 1.4-1 2019-03-18 [1] CRAN (R 3.6.0) crayon 1.3.4 2017-09-16 [1] CRAN (R 3.6.0) curl 3.3 2019-01-10 [1] CRAN (R 3.6.0) data.table * 1.12.2 2019-04-07 [1] CRAN (R 3.5.2) desc 1.2.0 2018-05-01 [1] CRAN (R 3.6.0) devtools * 2.0.2 2019-04-08 [1] CRAN (R 3.6.0) digest 0.6.18 2018-10-10 [1] CRAN (R 3.6.0) dplyr * 0.8.0.1 2019-02-15 [1] CRAN (R 3.5.2) forcats * 0.4.0 2019-02-17 [1] CRAN (R 3.6.0) formatR * 1.5 2017-04-25 [1] CRAN (R 3.5.0) fs 1.3.1 2019-05-06 [1] CRAN (R 3.6.0) generics 0.0.2 2018-11-29 [1] CRAN (R 3.5.0) ggplot2 * 3.1.0 2018-10-25 [1] CRAN (R 3.5.0) githubinstall * 0.2.2 2018-02-18 [1] CRAN (R 3.6.0) glue 1.3.0 2018-07-17 [1] CRAN (R 3.5.0) gtable 0.3.0 2019-03-25 [1] CRAN (R 3.6.0) haven 2.1.0 2019-02-19 [1] CRAN (R 3.6.0) hms 0.4.2 2018-03-10 [1] CRAN (R 3.6.0) httr 1.4.0 2018-12-11 [1] CRAN (R 3.6.0) jsonlite 1.6 2018-12-07 [1] CRAN (R 3.6.0) lattice 0.20-38 2018-11-04 [2] CRAN (R 3.6.0) lazyeval 0.2.2 2019-03-15 [1] CRAN (R 3.6.0) lubridate 1.7.4 2018-04-11 [1] CRAN (R 3.6.0) magrittr 1.5 2014-11-22 [1] CRAN (R 3.6.0) memoise 1.1.0 2017-04-21 [1] CRAN (R 3.6.0) microbenchmark 1.4-6 2018-10-18 [1] CRAN (R 3.6.0) modelr 0.1.4 2019-02-18 [1] CRAN (R 3.6.0) munsell 0.5.0 2018-06-12 [1] CRAN (R 3.6.0) nlme 3.1-139 2019-04-09 [2] CRAN (R 3.6.0) pillar 1.3.1 2018-12-15 [1] CRAN (R 3.5.0) pkgbuild 1.0.3 2019-03-20 [1] CRAN (R 3.6.0) pkgconfig 2.0.2 2018-08-16 [1] CRAN (R 3.5.0) pkgload 1.0.2 2018-10-29 [1] CRAN (R 3.5.0) plyr 1.8.4 2016-06-08 [1] CRAN (R 3.6.0) prettyunits 1.0.2 2015-07-13 [1] CRAN (R 3.5.0) processx 3.3.1 2019-05-08 [1] CRAN (R 3.6.0) ps 1.3.0 2018-12-21 [1] CRAN (R 3.5.0) purrr * 0.3.0 2019-01-27 [1] CRAN (R 3.5.2) R6 2.4.0 2019-02-14 [1] CRAN (R 3.5.2) Rcpp 1.0.1 2019-03-17 [1] CRAN (R 3.5.2) readr * 1.3.1 2018-12-21 [1] CRAN (R 3.5.0) readxl 1.3.1 2019-03-13 [1] CRAN (R 3.6.0) remotes 2.0.4 2019-04-10 [1] CRAN (R 3.6.0) rlang 0.3.1 2019-01-08 [1] CRAN (R 3.5.2) rprojroot 1.3-2 2018-01-03 [1] CRAN (R 3.6.0) rstudioapi 0.8 2018-10-02 [1] CRAN (R 3.5.0) rvest 0.3.4 2019-05-15 [1] CRAN (R 3.6.0) scales 1.0.0 2018-08-09 [1] CRAN (R 3.5.0) sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 3.6.0) stringi 1.3.1 2019-02-13 [1] CRAN (R 3.5.2) stringr * 1.4.0 2019-02-10 [1] CRAN (R 3.5.2) testthat 2.1.1 2019-04-23 [1] CRAN (R 3.6.0) tibble * 2.0.1 2019-01-12 [1] CRAN (R 3.5.2) tidyr * 0.8.3 2019-03-01 [1] CRAN (R 3.5.2) tidyselect 0.2.5 2018-10-11 [1] CRAN (R 3.5.0) tidyverse * 1.2.1 2017-11-14 [1] CRAN (R 3.6.0) usethis * 1.5.0 2019-04-07 [1] CRAN (R 3.6.0) vroom * 1.0.1 2019-05-14 [1] CRAN (R 3.5.2) withr 2.1.2 2018-03-15 [1] CRAN (R 3.6.0) xml2 1.2.0 2018-01-24 [1] CRAN (R 3.6.0)
ファイルが大きいと速くならない...?
Twitter上でいくつか検証してくれた方がいました。ファイルが大きいと readr::read_csv
と大差ない?
vroomパッケージ試してみたが、読込速度はread_csvと変わらなかった…
— データポエマー[,-5] (@bob3bob3) May 17, 2019
freadの方が早い。何か追加の設定が必要なのかな。
手元の628 MBのcsvファイルで10回ずつ試した結果。 pic.twitter.com/C3WRu8HSaW
巨大なCSV(PISA2015)でやってみた。あまり速くない
— Haruhiko Okumura (@h_okumura) May 16, 2019
1回目 2回目
readr 1'21" 1'17"
data.table 21" 14"
vroom 1'34" 38"
pandas 1'09" 51"
横長のデータだと速くならない...?
未検証
vroomは横長データが苦手ってことなのかな?(横長データのベンチマークを入れる、というissueがオープンのままだった)
— Hiroaki Yutani (@yutannihilation) May 17, 2019
所感
ちょっと触ってみただけなので、どうしてこうなるのかやこのパッケージが威力を発揮する場面は正直まだつかめてないです。引き続き調査したいです。