目次 †
概要 †ディレクトリ配下の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 ぐらいにはなる。 機会があればマシンリソースの消費具合も測ってみたい。 |