2013-01-22 16 views
6

Rで、いくつかのtimeseriesデータをxtsとしてhttp://www.truefx.com/?page=downloadsから結合して変換しようとしていますが、ファイルが大きく、多数のファイルがあるため、ノートパソコンで問題が発生しています。それらは、zipファイルとして圧縮されたcsvファイルとして保存されます。Rのメモリを解放する

ハードディスクをダウンロードして解凍するのは簡単です(ただし、ハードディスクドライブには十分なスペースが必要です)。

1ヶ月分のデータ用に350MB以上のファイルをRにロードすると、data.tableパッケージの新しいfread()ファンクションを使用するのが合理的に簡単です。

タイムスタンプが簡単に読み取られ、中間の列が生成されるように、一部のデータ変換可能な変換が(関数内で)実行されます。その後、データテーブルはハードドライブ上のRDataファイルとして保存され、データテーブルオブジェクトへの参照はすべてワークスペースから削除され、削除後にgc()が実行されます...ただし、アクティビティモニタでRセッションを見るとMacから実行)...それはまだRAMの1GBを占めているように見える...と物事は少し遅れているようだ...私は同時にCSVファイルの価値をロードするつもりだった、変換するそれらを組み合わせて1つのxtsオブジェクトを作成します。これは1か月で1GBのRAMを使用すると実行不可能に見えます。

私は各ファイルを順番にダウンロードして変換し、Rをシャットダウンして保存し、RDataファイルをロードしてバインドするまで繰り返すことができますが、より効率的な方法があることを願っていました。これを実行して、データテーブルへの参照をすべて削除した後、「正常」でないか、RAM使用率のスタートアップレベルに戻ります。 gc()よりもメモリを消去する方が良いでしょうか?どんな提案も大歓迎です。

+1

あなたが持っています同じ症状があれば'fread'の代わりに' read.csv'を使用しますか? – GSee

+1

これは、 'x < - read.csv(を使用して、http://stackoverflow.com/questions/1467201/forcing-garbage-collection-to-run-in-r-with-the-gc-command – redmode

+0

に関連しているようです...) 'はメモリ使用量を1.2GBにしてから' rm(x) 'を実行し、その後に' gc() 'を実行すると894MBになります。 Rの起動/起動時に –

答えて

6

私のプロジェクトでは、大きなファイルをたくさん扱わなければなりませんでした。

  1. 別のRスクリプトでメモリを必要とする操作を分離します。
  2. 実行後に破棄される新しいプロセスで各スクリプトを実行します。したがって、システムは使用済みメモリを戻します。
  3. テキストファイルを使用してスクリプトにパラメータを渡します。

以下のおもちゃの例を考えてみましょう。

データ生成:

setwd("/path/to") 
write.table(matrix(1:5e7, ncol=10), "temp.csv") # 465.2 Mb file 

slave.R - メモリを消費一部

setwd("/path/to") 
library(data.table) 

# simple processing 
f <- function(dt){ 
    dt <- dt[1:nrow(dt),] 
    dt[,new.row:=1] 
    return (dt) 
} 

# reads parameters from file 
csv <- read.table("io.csv") 
infile <- as.character(csv[1,1]) 
outfile <- as.character(csv[2,1]) 

# memory-hungry operations 
dt <- as.data.table(read.csv(infile)) 
dt <- f(dt) 
write.table(dt, outfile) 

master.R - 個別のプロセスで奴隷を実行

setwd("/path/to") 

# 3 files processing 
for(i in 1:3){ 
    # sets iteration-specific parameters 
    csv <- c("temp.csv", paste("temp", i, ".csv", sep="")) 
    write.table(csv, "io.csv") 

    # executes slave process 
    system("R -f slave.R") 
} 
+0

努力のために+1しますが、 'read.csv(infile)'は 'colClasses'を使用していないので、その理由でメモリが空いている可能性があります。 R-Forgeの 'data.table' v1.8.7で新しい' fread'関数を試しましたか?ユーザーは成功したと報告しています。 –

+0

@MatthewDowle:はい、私は 'fread'を試してみて、私の必要にぴったりなものを見つけました。しかし、AFAIK、現在のCRAN 'data.table'はそれを持っていませんか?だから私は_safe_ 'read.table'と' write.table'をここに入れることにしました。 – redmode

+0

@MatthewDowle:もっと重要なのは、@ h.l.mが 'fread'を使っている間のメモリの問題を報告したことです。だから、これは私の答えの要点ではありません。基本的なアイデアは、メモリが空いていることを保証するために、空腹のタスクを別々のプロセスで実行することでした。 – redmode

関連する問題