library(data.table)
library(arrow)
library(microbenchmark)
library(ggplot2)

1 データ

nr <- 100000
nc <- 200
n <- nr * nc
d <- matrix(rnorm(n), nrow = nr, ncol = nc) |> as.data.frame()
d.a <- matrix('あ', nrow = nr, ncol = nc) |> as.data.frame()

2 書込速度

書き込みはParquetよりCSV最速処理(data.table::fwrite)の方が速い。

乱数データ書込時間:

microbenchmark(
  "data.table::fwrite"   = {fwrite(d, 'd.csv')},
  "arrow::write_parquet" = {write_parquet(d, 'd.parquet')},
  times = 30L) |> autoplot(log = FALSE)

単一データ書込時間:

d.a <- matrix('あ', nrow = nr, ncol = nc) |> as.data.frame()
microbenchmark(
  "data.table::fwrite"   = {fwrite(d, 'd.csv')},
  "arrow::write_parquet" = {write_parquet(d, 'd.parquet')},
  times = 30L) |> autoplot(log = FALSE)

3 読込速度

読み込みはCSV最速処理(data.table::fread)よりParquetの方が速い。

microbenchmark(
  "data.table::fread"   = {fread('d.csv')},
  "arrow::read_parquet" = {read_parquet('d.parquet')},
  times = 30L) |> autoplot(log = FALSE)

4 ファイルサイズ

Parquetのファイルサイズは圧縮されているのでCSVより小さい。 CSVファイルも圧縮できるが時間が掛かる。

MB <- 2^20
round( file.size('d.csv') / MB )
## [1] 346
round( file.size('d.parquet') / MB )
## [1] 193

5 まとめ

Parquetはファイルサイズがとても小さくビッグデータの蓄積に適している。 列指向フォーマットのため,読み込み速度は非常に速い。 複雑なクエリを用いた分析処理が多い, いわゆるOLAP(online analytical processing)用のファイルフォーマットである。