7

16GB のメモリを搭載したマシンでいくつかのシミュレーションを実行しています。まず、いくつかのエラーに遭遇しました:

Error: cannot allocate vector of size 6000.1 Mb (the number might be not accurate)

次に、以下を使用して R により多くのメモリを割り当てようとしました。

memory.limit(1E10)

このような大きな数を選択する理由はmemory.limit、システムの総メモリよりも少ない数を選択することができなかったからです

In memory.size(size) : cannot decrease memory limit: ignored

これを行った後、シミュレーションを終了することができますが、R は約 15GB のメモリを使用したため、事後分析を行うことができませんでした。

object.size()以前は、生成されたすべての変数の合計メモリ使用量を見積もっていましたが、約 10GB しかかかりませんでした。Rが残りのメモリをどこに持っていったのかわかりませんでした。私の質問は、マシンを爆発させずに R にメモリを合理的に割り当てるにはどうすればよいかということです。ありがとう!

4

1 に答える 1

2

R はそのように解釈されます WYSINAWYG (あなたが見るものは常にあなたが得るものとは限りません)。コメントに記載されているように、オブジェクトのコピーにより、オブジェクトのストレージに必要なメモリがさらに必要になります。また、非効率であるだけでなく、ネストされたループは、最も内側のループで実行されないforため、悪い考えである可能性があります。gcこれらのいずれかがある場合は、ベクトル化されたメソッドを使用してそれらを削除するか、手動でgcループを呼び出してガベージ コレクションを強制することをお勧めしますが、これにより動作が多少遅くなることに注意してください。

単純なオブジェクトに必要なメモリの問題は、次の例で説明できます。このコードはオブジェクトを成長させdata.frameます。前後のメモリ使用量と結果のオブジェクト サイズを監視します。gcが呼び出される前に蓄積できるゴミがたくさんあります。Windows では *nix システムよりもガベージ コレクションに問題があると思います。一番下の例は Mac OS X では再現できませんが、Windows では再現できます。ループとその他の説明は、The R Infernoの 13 ページにあります...

# Current memory usage in Mb
memory.size()
# [1] 130.61
n = 1000

# Run loop overwriting current objects
my.df <- data.frame(a=character(0), b=numeric(0))
for(i in 1:n) {
this.N <- rpois(1, 10)
my.df <- rbind(my.df, data.frame(a=sample(letters,
this.N, replace=TRUE), b=runif(this.N)))
}
# Current memory usage afterwards (in Mb)
memory.size()
# [1] 136.34

# BUT... Size of my.df
print( object.size( my.df ) , units = "Mb" )
0.1 Mb
于 2013-03-26T11:57:20.207 に答える