想定読者
- デフォルトの
utils::read.csv()を使い続けている人 - tibble型で読み込むために
readr::read_csv()を使っている人 - 少しでも速くデータを読み込みたい人
1. はじめに
1.1 概要
本記事では、readr::read_csv()とarrow:read_csv_arrow()のベンチマークテストをします。
結論から述べると「軽量データであっても、実行速度(+使用メモリ)の観点からarrow:read_csv_arrow()を使った方がよい」となりました。
数GBの大規模データを比較したサイトは既に複数あるため(参考)、今回は日常的に使うであろう軽量~中規模データに着目します。
なお、検証に使ったコード全文はGitHubから確認・ダウンロードできます。
1.2 なぜarrowなのか?
- そもそも
utils::read.csv()でdata.frame型として扱うよりも、tibble型で処理するのが今のデファクトスタンダード -
utils::read.csv()は読み込み速度や型認識に問題あり1 -
readrと同じく、最初からtibble型で読み込まれる-
data.table::fread()やpolars::pl$scan_csv()では実現できない
-
-
readrと同じく、多機能- 乗り換えても支障がない
-
arrowだとPythonとのデータ受け渡しも可能
-
readrよりも、読み込み速度が速い(本記事の結論)
2. 使用データ・検証方法
2.1 データ
検証に使用するデータは以下の4つ(+1)です。いずれもフリーで入手できます。
- 軽量データ1
- UC Irvine Machine Learning Repositoryの「Wine Quality」データ
- 軽量データ2
- 統計センターの教育用標準データセット「SSDSE-県別推移」
- 軽量データ3
- 統計センターの教育用標準データセット「SSDSE-市区町村」
- 中規模データ
- Data.govの「Crime Data from 2020 to Present」
- ロサンゼルス市警察が収集した犯罪データ
- 大規模データ(比較用)
- Seattle Open Dataの「Checkouts by Title」
- シアトル公共図書館におけるタイトル別・月別の貸出記録
各データの情報は以下の通り、特にサイズに注目してもらえばと思います。
2.2 データの規模感
各データのサイズ感は以下の画像で確認できます。
大規模データ >>>>> 中規模データ >>>>> 軽量データ3 > 軽量データ2 > 軽量データ1
私の場合、日常的に扱うのは軽量データ2程度です。このデータは12年×47都道府県パネルデータであることを考えると、社会科学の分野であればこのデータが検証に適していると思います。
社会科学でもPISAのデータをすべて読み込むと大規模データくらいになる2と思いますが、そのような場合はデータを読み込まずに分轄するといった対応が有効です。
大規模データの読み込み・整形に関しては、『R for Data Science (2e)』が参考になります。
2.3 検証方法
Rのmicrobenchmarkパッケージとbenchパッケージを使います3。
前者は良い感じのプロットを簡単に出せるのと数百回の反復を行えるのがメリットです。後者は1秒あたり実行回数や使用メモリなど前者にはない出力が可能です。
3. 検証結果
3.1 軽量データ
microbenchmarkによる可視化
すべてのデータでarrow::read_csv_arrowの実行速度が上回っていることが分かります。
【結果の見方】
左にあるほど実行時間が短いことを意味します。
bench::markによる結果
こちらでもarrow::read_csv_arrowは5~7倍速いことが分かります。使用メモリもarrowの方が少ないようです。
ただし、bench::markで分かる使用メモリはR heap(Rの管理領域)内のみであり、メモリに関しては、C++を多用しているarrowの性能を過大評価している可能性はあります(参考)。
3.2 中規模データ
microbenchmarkによる可視化
軽量データに比べれば差は縮まりましたが、やはりarrowの方が速いようです。
bench::markによる結果
中規模データでもarrow::read_csv_arrowは2倍ほど速いようです。
3.3 大規模データ
本記事の射程外なので引用のみで済ませますが、大抵の比較でarrowはトップないし上位の成績のようです。(ただし、data.tableには負けがち?)
- 瓜生真也「Rによる大規模データの処理」の補足資料「ベンチマーク編」
- Moritz Mueller-Navarra「Reading Data - data.table & arrow」
- Jonathan Keane & Neal Richardson「Measuring and Monitoring Arrow's Performance: Some Updated R Benchmarks」
4. 結論
軽量~中規模データであっても、より良い実行速度を求めるならばarrow:read_csv_arrow()を使った方がよい
実行環境
Rやパッケージのバージョン
> sessionInfo()
R version 4.5.1 (2025-06-13 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26200)
Matrix products: default
LAPACK version 3.12.1
locale:
[1] LC_COLLATE=Japanese_Japan.utf8 LC_CTYPE=Japanese_Japan.utf8 LC_MONETARY=Japanese_Japan.utf8
[4] LC_NUMERIC=C LC_TIME=Japanese_Japan.utf8
time zone: Asia/Tokyo
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] bench_1.1.4 microbenchmark_1.5.0 gtExtras_0.6.1 gt_1.0.0 patchwork_1.3.2
[6] see_0.12.0 here_1.0.1 arrow_22.0.0 magrittr_2.0.3 lubridate_1.9.4
[11] forcats_1.0.0 stringr_1.5.2 dplyr_1.1.4 purrr_1.1.0 readr_2.1.5
[16] tidyr_1.3.1 tibble_3.3.0 ggplot2_4.0.1 tidyverse_2.0.0
loaded via a namespace (and not attached):
[1] gtable_0.3.6 xfun_0.53 websocket_1.4.4 processx_3.8.6 paletteer_1.6.0
[6] tzdb_0.5.0 ps_1.9.1 vctrs_0.6.5 tools_4.5.1 generics_0.1.4
[11] pacman_0.5.1 pkgconfig_2.0.3 RColorBrewer_1.1-3 S7_0.2.0 assertthat_0.2.1
[16] lifecycle_1.0.4 compiler_4.5.1 farver_2.1.2 textshaping_1.0.1 chromote_0.5.1
[21] fontawesome_0.5.3 htmltools_0.5.8.1 sass_0.4.10 later_1.4.2 pillar_1.11.0
[26] crayon_1.5.3 webshot2_0.1.2 tidyselect_1.2.1 digest_0.6.37 stringi_1.8.7
[31] rematch2_2.1.2 rprojroot_2.1.1 fastmap_1.2.0 grid_4.5.1 cli_3.6.5
[36] utf8_1.2.6 withr_3.0.2 promises_1.3.3 scales_1.4.0 bit64_4.6.0-1
[41] timechange_0.3.0 bit_4.6.0 ragg_1.4.0 hms_1.1.3 evaluate_1.0.5
[46] knitr_1.50 rlang_1.1.6 Rcpp_1.1.0 glue_1.8.0 xml2_1.4.0
[51] pkgload_1.4.0 jsonlite_2.0.0 rstudioapi_0.17.1 R6_2.6.1 fs_1.6.6
[56] systemfonts_1.2.3
参考文献
-
パッケージの公式情報 -
ベンチマークや読み込み関数について- 宋財泫・矢内勇生「私たちのR」
- 瓜生真也「Rによる大規模データの処理」の補足資料「ベンチマーク編」
- Moritz Mueller-Navarra「Reading Data - data.table & arrow」
- Jonathan Keane & Neal Richardson「Measuring and Monitoring Arrow's Performance: Some Updated R Benchmarks」
- Hadley Wickham, Mine Çetinkaya-Rundel, and Garrett Grolemund『R for Data Science (2e)』
- eitsupi「2022年末、Rでcsvを読む」
- ガースー「【R言語】重たいファイルを効率的に処理する方法」
- Ringa hyj「大量で巨大なcsvをRで読み込む時の最適解【vroom,readr,data.table】」
- 「Vroom Benchmarks」
-
作図に関して- Claus O. Wilke「Fundamentals of Data Visualization」
- Kazuharu Yanagimoto「Rで論文を書く実践的なテクニック集 (グラフ編)」
- 宋財泫「gt入門」
-
http://hdl.handle.net/10780/1959(2025年11月24日) ↩
-
実行時間の計測には
tictocパッケージやSys.time()も有効です。 ↩