2011-10-19 12 views
4

MNPパッケージ使用時のRのメモリ使用に関する質問があります。私の目標は、多項式プロビットモデルを推定し、そのモデルを使用して大量のデータセットの選択肢を予測することです。予測データを分割してリストにしました。MNPパッケージを使用した場合のメモリリークR

問題は、リストをループして予測すると、Rによって使用されるメモリが絶えず増加し、コンピュータの最大メモリに達した後にスワップ領域を使用することです。割り当てられたメモリは、それらの境界にぶつかっても解放されません。これは、私が追加のオブジェクトを作成しないために起こりますので、何が起こっているのか分かりません。

以下、上記の問題を抱えるサンプルコードを貼り付けました。この例を実行すると、メモリは絶えず増加し、すべての変数を削除してgc()を呼び出しても使用されたままになります。

私が実際に持っているデータは、この例で生成されたものよりはるかに大きいので、回避策を見つける必要があります。

私の質問は以下のとおりです。

なぜこのスクリプトはそれほど多くのメモリを使用していますか?

各ステップの後に割り当てられたメモリを解放するにはどうすればよいですか?ここで

library(MNP) 

nr <- 10000 
draws <- 500 
pieces <- 100 

# Create artificial training data 
trainingData <- data.frame(y = sample(c(1,2,3), nr, rep = T), x1 = sample(1:nr), x2 = sample(1:nr), x3 = sample(1:nr)) 

# Create artificial predictor data 
predictorData <- list() 
for(i in 1:pieces){ 
    predictorData[[i]] <- data.frame(y = NA, x1 = sample(1:nr), x2 = sample(1:nr), x3 = sample(1:nr)) 
} 

# Estimate multinomial probit 
mnp.out <- mnp(y ~ x1 + x2, trainingData, n.draws = draws) 

# Predict using predictor data 
predicted <- list() 
for(i in 1:length(predictorData)){ 
    cat('|') 
    mnp.pred <- predict(mnp.out, predictorData[[i]], type = 'prob')$p 
    mnp.pred <- colnames(mnp.pred)[apply(mnp.pred, 1, which.max)] 
    predicted[[i]] <- mnp.pred 
    rm(mnp.pred) 
    gc() 
} 

# Unite output into one string 
predicted <- factor(unlist(predicted)) 

出力統計は、スクリプトを実行した後、次のとおりです。ここで

> rm(list = ls()) 
> gc() 
     used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 158950 8.5  407500 21.8 407500 21.8 
Vcells 142001 1.1 33026373 252.0 61418067 468.6 

はRの私の仕様は以下のとおりです。

> sessionInfo() 

R version 2.13.1 (2011-07-08) 
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] MNP_2.6-2 MASS_7.3-14 
+0

上記のスクリプト(rm()とgc()を含む)を実行した後、私のコンピュータ上のメモリ使用量は次のようになります: 'RSIZE 5661M、VPRVT 6108M、VSIZE 9500M' – yellowcap

+0

これは特有です。これを実行する前に仮想メモリの使用量は何でしたか?常駐メモリに関しては、これは偽のものになることがあります。これらは、OSによって回収できるバッファです。 OSXに 'free'がある場合は、それを試してその情報を報告してください。また、Rの最新バージョンを使用するとどうなりますか?私はMNPのそれ以上の最近のバージョンがないことがわかります。 – Iterator

答えて

1

結果は私のように、異常ないないようですこれがメモリリークを示しているとは思わない。私はあなたがgc()からのデータを誤読していると思われます:右側の列はRによるメモリの追跡中に使用される最大メモリですgc(reset = TRUE)を使用する場合、表示される最大値はLHSで使用されるメモリ、 MBと1.1MBは「used」の下にリストされています。

MNPは予測段階で多くのメモリを消費していると思われます。したがって、予測データをより小さなチャンクに分け、少ない行で分割する以外に、できることはあまりありません。

あなたが複数のコアを持っている場合は、ループの各反復が完了した後に、これはあなたの独立した計算の高速化や割り当てられたRAMをクリアすることの利点を与えるとして、doSMPまたはdoMCとともに、foreachパッケージを使用して検討するかもしれません(別のメモリ空間を使用するRのフォークを含むので、私は信じています)。

+0

'foreach'パッケージを使用すると、問題の一部を解決できる可能性があります。しかし、予測子ループの問題は残っています。少なくとも私のコンピュータでは、このスクリプトのRで使用されるメモリは順調に増加し、Rを終了するとリリースされます。スクリプトを編集し、nrを100に増やしました。コンピュータで編集したスクリプトを実行すると、predictorループによってメモリ使用量が増え、メモリが最大のRAMに達しても解放されません(スワップ領域の使用を開始するだけです)。 – yellowcap

+0

'foreach'がうまくいかない場合は、メンテナに連絡するのが最善だと思います。また、Unixユーティリティ 'valgrind'を試して、メモリリークがあるかどうか確認することもできます。私はこれもOS Xで動作すると仮定します。 – Iterator

関連する問題