vroomパッケージを試してみたが……
追記あり。
Twitterで話題になっていたcsvファイルなどを高速に読み込むR用パッケージ vroom を試してみました。
結論から言うと自分の環境では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 |
うーん、vroom全然速くない……
なんでこうなるんだろう?
ちょっと気になったのは id:y-mattu さんはMacで私はWindowsという点。
OSによる挙動の違いだったりするのだろうか?
session_info()
- Session info --------------------------------------------------------------------------------------------------
- Packages ------------------------------------------------------------------------------------------------------
追記
もしかしたら col_types を指定すれば速くなるとか
— Haruhiko Okumura (@h_okumura) May 18, 2019
というご指摘があったので型を指定して試してみました。
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 |
ということで、型を指定するとvroomがグッと速くなります。
アドホックな分析の場合、型を調べて、指定して……というのは手間なのでfreadでよさそうですが、定型データを定期的に分析するような場合はvroomを活用するのがよさそうです。