目次

概要

ディレクトリ配下の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 ぐらいにはなる。
さらに fread を使用すれば 1/30 にまで短縮。

機会があればマシンリソースの消費具合も測ってみたい。


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-04-07 (日) 12:53:05 (70d)