9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【R】read.csvやreadrからarrowに乗り換えませんか?

Last updated at Posted at 2025-11-24

想定読者

  • デフォルトの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なのか?

  1. そもそもutils::read.csv()でdata.frame型として扱うよりも、tibble型で処理するのが今のデファクトスタンダード
  2. utils::read.csv()は読み込み速度や型認識に問題あり1
  3. readrと同じく、最初からtibble型で読み込まれる
    • data.table::fread()polars::pl$scan_csv()では実現できない
  4. readrと同じく、多機能
    • 乗り換えても支障がない
    • arrowだとPythonとのデータ受け渡しも可能
  5. readrよりも、読み込み速度が速い(本記事の結論

2. 使用データ・検証方法

2.1 データ

 検証に使用するデータは以下の4つ(+1)です。いずれもフリーで入手できます。

  • 軽量データ1
    • UC Irvine Machine Learning Repositoryの「Wine Quality」データ
  • 軽量データ2
  • 軽量データ3
  • 中規模データ
  • 大規模データ(比較用)
    • 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_arrow5~7倍速いことが分かります。使用メモリもarrowの方が少ないようです。

ただし、bench::markで分かる使用メモリはR heap(Rの管理領域)内のみであり、メモリに関しては、C++を多用しているarrowの性能を過大評価している可能性はあります(参考)。

3.2 中規模データ

microbenchmarkによる可視化

軽量データに比べれば差は縮まりましたが、やはりarrowの方が速いようです。

bench::markによる結果

中規模データでもarrow::read_csv_arrow2倍ほど速いようです。

3.3 大規模データ

 本記事の射程外なので引用のみで済ませますが、大抵の比較でarrowはトップないし上位の成績のようです。(ただし、data.tableには負けがち?)

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 

参考文献

  1. https://www.jaysong.net/RBook/io.html#fnref2

  2. http://hdl.handle.net/10780/1959(2025年11月24日)

  3. 実行時間の計測にはtictocパッケージやSys.time()も有効です。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?