今日はちょっと手抜きですが、オブジェクトの保存と読み込みです。
Rは物理メモリで仕事をするので、大きいデータを処理しているとメモリがすぐなくなってしまう。
僕は貧乏なので、とくに深刻です。
だから、save関数とload関数にはお世話になりっぱなしです。
- 基本的な使い方(保存)
> x <- 1:10 > y <- matrix(1:12,ncol=4) > > save(x, file="x.Rdata") # オブジェクトxだけを保存するとき > save(list=c("x", "y"), file="xy.Rdata") # オブジェクトxとyを保存するとき、listの引数はcharacterです > save(list=ls(), file="all.Rdata") # ワークスペースのオブジェクトを保存するとき > # save(list=ls(all=TRUE), file="all.Rdata")でも可
拡張子は無くても、何でもいいんですが、"Rdata"にしておくと呼び出すとき便利と思う。
- 基本的な使い方(呼び出し)
> load("x.Rdata") # オブジェクトxだけを読み込む > > # ワークスペースの拡張子Rdataを全部読み込みたいとき > lapply(grep("Rdata$", dir(), value=TRUE), load) [[1]] [1] "x" "y" [[2]] [1] "x" [[3]] [1] "x" "y"
- for-loopでloop毎に結果を保存する
LOOCVとかしていると、オブジェクトがどんどん増えて、メモリがどんどんなくなって、「あ〜!!!!」ってなります。そんなときに良く使っていた。
> for(i in 1:10){ + x <- matrix(sample(100,12,re=TRUE),ncol=3) + save(x, file=paste(i, "Rdata", sep=".")) + rm(x) # なくてもいいけど + gc(); gc() #なくてもいいけど + }
最近は、大規模データを扱えるパッケージが増えているようですねffパッケージとかbigmemoryパッケージとか。
僕は経験が無いのですが、第2回JapanRや第10回TokyoWebMiningでも議論されている。
あと、R外でも大規模データのアルゴリズムが注目されてますね。Hadoopとか、Jubatusとか。
Mahoutを繋いで、ガリガリやってみないな〜って、ちょっと憧れます。