#mynavi(R言語入門)
#setlinebreak(on);

* 目次 [#x72f200f]
#contents
- 関連
-- [[R言語入門]]

* 概要 [#f9f05c92]
#html(<div style="padding-left: 20px;">)
ディレクトリ配下のcsvを1つのデータフレームに読み込む場合のパフォーマンス比較。
#html(</div>)

* 準備 [#y731e85e]
#html(<div style="padding-left: 20px;">)

** テストデータ作成 [#ccdf8b16]
#html(<div style="padding-left: 20px;">)
#myterm2(){{
# データ格納用ディレクトリ作成
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=",")
}
}}
#html(</div>)

** data.table インストール [#tb618176]
#html(<div style="padding-left: 20px;">)

fread を使用した場合のパフォーマンスも図ってみるので data.table をインストールしておく。
fread を使用した場合のパフォーマンスも図ってみたいので data.table をインストールしておく。
#myterm2(){{
install.packages("data.table")
}}
#html(</div>)

#html(</div>)

* 処理の作成 [#r3a3bc32]
#html(<div style="padding-left: 20px;">)

** 普通にファイル数分ループして rbind する [#r073cd3d]
#html(<div style="padding-left: 20px;">)
read_csv_normal.R
#mycode2(){{
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")
}}
#html(</div>)

** 繰り返し処理を lapply と do.call に変更する [#ndfe7df4]
#html(<div style="padding-left: 20px;">)
read_csv_apply1.R
#mycode2(){{
files <- list.files("csv", full.names = T)
df <- do.call(rbind, lapply(files, read.table, sep=",", header = T))
cat("read count:", nrow(df), "\n")
}}
#html(</div>)

** さらに読み込み自体を data.table の fread に変える場合 [#y4fd2f58]
#html(<div style="padding-left: 20px;">)
read_csv_apply2.R
#mycode2(){{
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")
}}
#html(</div>)

#html(</div>)

* 結果 [#q6ceafb3]
#html(<div style="padding-left: 20px;">)

#myterm2(){{
> 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 にまで短縮。

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

#html(</div>)

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS