★データ解析備忘録★

ゆる〜い技術メモ

vroomパッケージを使ってみる

これはなに

データ読み込み系のパッケージで新しいのが出現したので、ちょっと触ってみた記録です。 2019年5月にリリースされたばかりのほやほやパッケージ。

vroomパッケージ

github.com

GitHubのレポジトリには

The fastest delimited reader for R

とあります。Rで区切り値のファイルを読み込むのに最速だぜということらしいです。

特徴

readr::read_***() になくて vroom::vroom() にある機能をGitHubから引用すると、およそ以下のような感じです。

  1. 区切り値判定
  2. マルチバイト、Unicodeの区切り値に対応
  3. 読み込む時点でほしい列を選択できる 。 dplyr::select() っぽい書き方ができる。
  4. 複数のファイルを読み込んで連結できる
  5. robust to invalid inputs. vroom has been extensively tested with the afl fuzz tester).

  1. data.table::fread() にはあったけど readr::read_***() にはなかったやつ。もちろん区切り値は自分で指定できます( delim 引数)。

  2. は地味に嬉しいかな?まあマルチバイトの区切り値のファイルなんて闇なので触れたくないですが。

  3. %>% select() しなくていいよってことだと思うけどあんまりメリットを感じない... 例: vroom("mtcars.tsv", col_select = c(model, cyl, gear))

  4. files みたいなオブジェクトにファイル一覧が格納されてるときにこれまでは purrr::map_dfr(files, readr::read_csv) みたいにやってたのを vroom(files) で一発でできるよってやつ。お手軽にできるのは嬉しい...のか?多分人による。

  5. はよくわかりません。要調査。

速度比較

簡単なcsvベンチマークを取ってみます。

使うファイル

以前僕が作った以下のレポジトリの csv/Sales.csv を使います。100万行3列で44.7MB

github.com

コード

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

f:id:songcunyouzai:20190517190951p:plain

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 と大差ない?

横長のデータだと速くならない...?

未検証

所感

ちょっと触ってみただけなので、どうしてこうなるのかやこのパッケージが威力を発揮する場面は正直まだつかめてないです。引き続き調査したいです。