7

私のコードは次のようになります(元のコードと比較すると少し簡略化されたバージョンですが、それでも問題が反映されています)。

require(VGAM)

Median.sum  = vector(mode="numeric", length=75) 
AA.sum      = vector(mode="numeric", length=75)                                                    
BB.sum      = vector(mode="numeric", length=75)                   
Median      = array(0, dim=c(75 ,3)) 
AA          = array(0, dim=c(75 ,3))                                                    
BB          = array(0, dim=c(75 ,3))                              

y.sum     = vector(mode="numeric", length=100000)
y         = array(0, dim=c(100000,3))
b.size    = vector(mode="numeric", length=3) 
c.size    = vector(mode="numeric", length=3) 


for (h in 1:40)
{
  for (j in 1:75)
  {  
    for (i in 1:100000)
    {
      y.sum[i] = 0

      for (f in 1:3)
      {
        b.size[f] = rbinom(1, 30, 0.9)
        c.size[f] = 30 - rbinom(1, 30, 0.9) + 1
        y[i, f] = sum( rlnorm(b.size[f], 8.5, 1.9) ) + 
          sum( rgpd(c.size[f], 120000, 1870000, 0.158) )
        y.sum[i] = y.sum[i] + y[i, f]
      }
    }

    Median.sum[j] = median(y.sum)
    AA.sum[j] = mean(y.sum)
    BB.sum[j] = quantile(y.sum, probs=0.85)

    for (f in 1:3)
    {
      Median[j,f] = median(y[,f])
      AA[j,f] = mean(y[,f])
      BB[j,f] = quantile(y[,f], probs=0.85)
    }
  }
  #gc()
}

実行の途中で中断し(h = 7、j = 1、i = 93065)、エラーが発生します。

Error: cannot allocate vector of size 526.2 Mb

このメッセージを受け取った直後に、これ、これ、これを読みましそれでも十分ではありません。重要なのは、ガベージコレクター(gc())も、ワークスペースからすべてのオブジェクトをクリアすることも役に立たないということです。つまり、コードにガベージコレクターと操作の両方を入れて、すべての変数を削除し、ループ内でもう一度宣言しようとしたことを意味します(#gc()がある場所を見てください-ただし、後者は含まれていません私が投稿したコードで)。

すべてのプロシージャがループの各ステップで同じオブジェクトを使用するので、私には奇妙に思えます(=>ループの各ステップで同じボリュームのメモリを消費する必要があります)。なぜメモリ消費量が時間とともに増加するのですか?

さらに悪いことに、Rの同じセッションで作業し、さらに実行したい場合は、次のようにします。

rm(list=ls())
gc()

次のようなマイナーなものを宣言したい場合でも、同じエラーメッセージが表示されます。

abc = array(0, dim=c(10,3))

Rを閉じて新しいセッションを開始するだけで役立ちます。なんで?たぶん私のループを再コーディングする方法はありますか?

R:2.15.1(32ビット)、OS:Windows XP(32ビット)

私はここでかなり新しいので、すべてのヒントに感謝します!前もって感謝します。


編集:(アルンから)。この動作は、簡単な例だけで再現するのがさらに簡単だと思います。新しいRセッションを開始し、このコードをコピーして貼り付け、システムモニターでメモリが増大するのを確認します。

mm <- rep(0, 1e4) # initialise a vector
for (i in 1:1e3) {
    for (j in 1:1e3) {
        for (k in 1:1e4) {
            mm[k] <- k # already pre-allocated
         }
    }
}
4

2 に答える 2

4

ループgc()内にへの呼び出しを追加します。for (i in 1:100000)

gc()Arunのコードのタイトなループ内に呼び出しを追加すると、メモリの増加がなくなります。

これはメモリの増加を示しています。

mm <- rep(0, 1e4) # initialise a vector
for (i in 1:1e3) {
    for (j in 1:1e3) {
        for (k in 1:1e4) {
            mm[k] <- k # already pre-allocated
         }
     }
 }

これはしません:

mm <- rep(0, 1e4) # initialise a vector
for (i in 1:1e3) {
    for (j in 1:1e3) {
        for (k in 1:1e4) {
            mm[k] <- k # already pre-allocated
            gc()
         }
     }
 }

ここでの自動ガベージコレクションに問題があります。示されているように、最初のケースではコレクターが呼び出されていgcinfo(TRUE)ます。しかし、それでもメモリは非常に急速に増加します。

于 2013-03-24T17:36:35.427 に答える
2

これは機能しているようです(最も内側のループを関数に入れます)。遅くなったので最後まで実行しませんでしたが、コードのようにメモリの膨張に気づきませんでした。

require(VGAM)

Median.sum  = vector(mode="numeric", length=75) 
AA.sum      = vector(mode="numeric", length=75)                                                    
BB.sum      = vector(mode="numeric", length=75)                   
Median      = array(0, dim=c(75 ,3)) 
AA          = array(0, dim=c(75 ,3))                                                    
BB          = array(0, dim=c(75 ,3))                              


inner.fun <- function() {
  y.sum     = vector(mode="numeric", length=100000)
  y         = array(0, dim=c(100000,3))
  b.size    = vector(mode="numeric", length=3) 
  c.size    = vector(mode="numeric", length=3) 
  for (i in 1:100000)
    {
      y.sum[i] = 0

      for (f in 1:3)
      {
        b.size[f] = rbinom(1, 30, 0.9)
        c.size[f] = 30 - rbinom(1, 30, 0.9) + 1
        y[i, f] = sum( rlnorm(b.size[f], 8.5, 1.9) ) + 
          sum( rgpd(c.size[f], 120000, 1870000, 0.158) )
        y.sum[i] = y.sum[i] + y[i, f]
      }
    }
    list(y.sum, y)
}

for (h in 1:40)
{
  cat("\nh =", h,"; j = ")
  for (j in 1:75)
  {  
    cat(j," ")
    result = inner.fun()
    y.sum = result[[1]]
    y = result[[2]]
    Median.sum[j] = median(y.sum)
    AA.sum[j] = mean(y.sum)
    BB.sum[j] = quantile(y.sum, probs=0.85)

    for (f in 1:3)
    {
      Median[j,f] = median(y[,f])
      AA[j,f] = mean(y[,f])
      BB[j,f] = quantile(y[,f], probs=0.85)
    }
  }
}
于 2013-03-25T15:34:41.467 に答える