目次 †
概要 †ディレクトリ配下のcsvを1つのデータフレームに読み込む場合のパフォーマンス比較。 準備 †テストデータ作成 †# データ格納用ディレクトリ作成
system("mkdir csv")
# 1000件のデータを保持するファイルを1000個作成
for (i in 1:1000) {
df <- data.frame(no=1:1000, x=rnorm(1000), y=rnorm(1000))
filename <- paste("csv/test", i, ".csv", sep="")
write.table(df, filename, quote=F, col.names=T, row.names=F, sep=",")
}
data.table インストール †fread を使用した場合のパフォーマンスも図ってみたいので data.table をインストールしておく。 install.packages("data.table")
処理の作成 †普通にファイル数分ループして rbind する †read_csv_normal.R files <- list.files("csv", full.names = T)
df <- data.frame()
for (f in files) {
data <- read.table(f, sep=",", header=T)
df <- rbind(df, data)
}
cat("read count:", nrow(df), "\n")
繰り返し処理を lapply と do.call に変更する †read_csv_apply1.R files <- list.files("csv", full.names = T)
df <- do.call(rbind, lapply(files, read.table, sep=",", header = T))
cat("read count:", nrow(df), "\n")
さらに読み込み自体を data.table の fread に変える場合 †read_csv_apply2.R library("data.table")
files <- list.files("csv", full.names = T)
df <- do.call(rbind, lapply(files, fread, sep=",", data.table = F))
cat("read count:", nrow(df), "\n")
結果 †> system.time(source("read_csv_normal.R"))
read count: 1000000
ユーザ システム 経過
22.317 5.798 28.126
> system.time(source("read_csv_apply1.R"))
read count: 1000000
ユーザ システム 経過
3.133 0.131 3.265
> system.time(source("read_csv_apply2.R"))
read count: 1000000
ユーザ システム 経過
0.752 0.127 0.879
lapply と do.call を使えば 1/8 ぐらいにはなる。 機会があればマシンリソースの消費具合も測ってみたい。 |