vroomパッケージを試してみたが……

追記あり

Twitterで話題になっていたcsvファイルなどを高速に読み込むR用パッケージ vroom を試してみました。


github.com


結論から言うと自分の環境ではdata.table::fread()の方が速かったです。


id:songcunyouzai さんの記事のデータを使わせていただきます。
y-mattu.hatenablog.com

library(microbenchmark)
library(ggplot2)
file <- "Sales.csv"

compare <- microbenchmark('readr::read_csv' = {gc(); gc(); readr::read_csv(file)},
                          'data.table::fread' = {gc(); gc(); data.table::fread(file)},
                          'vroom::vroom' = {gc(); gc(); vroom::vroom(file, progress = FALSE)},
                          times = 100
                          )
compare
autoplot(compare)

devtools::session_info()
結果
expr min lq mean median uq max neval cld
readr::read_csv 1024.9577 1033.3797 1085.3734 1037.4678 1155.311 1310.8491 100 b
data.table::fread 808.9454 816.2527 864.3883 830.7628 936.749 979.5104 100 a
vroom::vroom 1141.2515 1197.7813 1247.7234 1232.6876 1318.041 1361.9606 100 c


f:id:bob3:20190518101809p:plain


うーん、vroom全然速くない……


なんでこうなるんだろう?


ちょっと気になったのは id:y-mattu さんはMacで私はWindowsという点。

OSによる挙動の違いだったりするのだろうか?

session_info()
  • Session info --------------------------------------------------------------------------------------------------
setting value version R version 3.6.0 (2019-04-26) os Windows 10 x64 system x86_64, mingw32 ui RStudio language (EN) collate Japanese_Japan.932 ctype Japanese_Japan.932 tz Asia/Tokyo date 2019-05-18
  • 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) callr 3.2.0 2019-03-15 [1] CRAN (R 3.6.0) cli 1.1.0 2019-03-19 [1] CRAN (R 3.6.0) codetools 0.2-16 2018-12-24 [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) data.table 1.12.2 2019-04-07 [1] CRAN (R 3.6.0) 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.1 2019-05-14 [1] CRAN (R 3.6.0) fs 1.3.1 2019-05-06 [1] CRAN (R 3.6.0) ggplot2 * 3.1.1 2019-04-07 [1] CRAN (R 3.6.0) glue 1.3.1 2019-03-12 [1] CRAN (R 3.6.0) gtable 0.3.0 2019-03-25 [1] CRAN (R 3.6.0) highr 0.8 2019-03-20 [1] CRAN (R 3.6.0) hms 0.4.2 2018-03-10 [1] CRAN (R 3.6.0) knitr 1.22 2019-03-08 [1] CRAN (R 3.6.0) lattice 0.20-38 2018-11-04 [1] CRAN (R 3.6.0) lazyeval 0.2.2 2019-03-15 [1] CRAN (R 3.6.0) magrittr 1.5 2014-11-22 [1] CRAN (R 3.6.0) MASS 7.3-51.4 2019-03-31 [1] CRAN (R 3.6.0) Matrix 1.2-17 2019-03-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) multcomp 1.4-10 2019-03-05 [1] CRAN (R 3.6.0) munsell 0.5.0 2018-06-12 [1] CRAN (R 3.6.0) mvtnorm 1.0-10 2019-03-05 [1] CRAN (R 3.6.0) pillar 1.4.0 2019-05-11 [1] CRAN (R 3.6.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.6.0) pkgload 1.0.2 2018-10-29 [1] CRAN (R 3.6.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.6.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.6.0) purrr 0.3.2 2019-03-15 [1] CRAN (R 3.6.0) R6 2.4.0 2019-02-14 [1] CRAN (R 3.6.0) Rcpp 1.0.1 2019-03-17 [1] CRAN (R 3.6.0) readr 1.3.1 2018-12-21 [1] CRAN (R 3.6.0) remotes 2.0.4 2019-04-10 [1] CRAN (R 3.6.0) rlang 0.3.4 2019-04-07 [1] CRAN (R 3.6.0) rprojroot 1.3-2 2018-01-03 [1] CRAN (R 3.6.0) rstudioapi 0.10 2019-03-19 [1] CRAN (R 3.6.0) sandwich 2.5-1 2019-04-06 [1] CRAN (R 3.6.0) scales 1.0.0 2018-08-09 [1] CRAN (R 3.6.0) sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 3.6.0) survival 2.44-1.1 2019-04-01 [1] CRAN (R 3.6.0) testthat 2.1.1 2019-04-23 [1] CRAN (R 3.6.0) TH.data 1.0-10 2019-01-21 [1] CRAN (R 3.6.0) tibble 2.1.1 2019-03-16 [1] CRAN (R 3.6.0) tidyselect 0.2.5 2018-10-11 [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.6.0) withr 2.1.2 2018-03-15 [1] CRAN (R 3.6.0) xfun 0.7 2019-05-14 [1] CRAN (R 3.6.0) zoo 1.8-5 2019-03-21 [1] CRAN (R 3.6.0)
Vrooom Vrooom

余談ですが、King Crimson に Vrooom と Vrooom Vrooom という曲があります。
名曲なのでみんな聴いてね!

www.youtube.com

追記


というご指摘があったので型を指定して試してみました。

library(microbenchmark)
library(ggplot2)
file <- "Sales.csv"

compare <- microbenchmark('readr::read_csv' = {gc(); gc(); readr::read_csv(file)},
                          'data.table::fread' = {gc(); gc(); data.table::fread(file)},
                          'vroom::vroom' = {gc(); gc(); vroom::vroom(file, progress = FALSE)},
                          'readr::read_csv(col_types)' = {gc(); gc();
                            readr::read_csv(file,
                                            col_types = c(UserID = "c", ProductID = "i", Timestamp = "c"))},
                          'data.table::fread(colClasses)' = {gc(); gc();
                            data.table::fread(file,
                                              colClasses=c(UserID = "character", ProductID = "integer", Timestamp = "character"))},
                          'vroom::vroom(col_types)' = {gc(); gc();
                            vroom::vroom(file, progress = FALSE,
                                         col_types = c(UserID = "c", ProductID = "i", Timestamp = "c"))},
                          times = 100
                          )
compare
autoplot(compare)
expr min lq mean median uq max neval cld
readr::read_csv 1481.9142 1495.2920 1584.0018 1516.5437 1660.4270 2282.7862 100 d
data.table::fread 1141.0688 1150.7112 1183.2774 1162.5873 1199.1071 1414.1438 100 b
vroom::vroom 1436.1859 1487.1280 1506.6311 1498.5312 1517.7352 1628.3527 100 c
readr::read_csv(col_types) 1420.3024 1433.1942 1503.9445 1450.5208 1538.2399 1892.8654 100 c
data.table::fread(colClasses) 1137.5738 1151.8764 1184.1724 1173.6862 1205.0418 1293.7130 100 b
vroom::vroom(col_types) 654.5454 659.3483 691.8653 677.3639 712.9926 849.8384 100 a


f:id:bob3:20190518131720p:plain


ということで、型を指定するとvroomがグッと速くなります。


アドホックな分析の場合、型を調べて、指定して……というのは手間なのでfreadでよさそうですが、定型データを定期的に分析するような場合はvroomを活用するのがよさそうです。