web-dev-qa-db-ja.com

Rメモリ管理/サイズn Mbのベクトルを割り当てることができない

私はRでラージオブジェクトを使用しようとしている問題に遭遇しています。例えば:

> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for

これは連続したメモリブロックを取得することの難しさに関連していることを理解しています( here から)。

サイズのベクトルを割り当てることができないエラーメッセージは、サイズがプロセスのアドレススペースの制限を超えたか、またはシステムがメモリを提供できなかったために、メモリを取得できなかったことを示します。 32ビットビルドでは、十分な空きメモリが利用できる可能性がありますが、それをマップするための十分な大きさの連続したアドレスブロックブロックではない可能性があります。

どうすればこれを回避できますか。私の主な難点は、私が自分のスクリプトの中のある点にたどり着き、Rがオブジェクトに200-300 Mbを割り当てることができないということです。不要なオブジェクトを慎重に削除しても、これは起こります。

編集:はい、すみません:Windows XP SP3、4GB RAM、R 2.12.0:

> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Caribbean.1252  LC_CTYPE=English_Caribbean.1252   
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Caribbean.1252    

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

このデータをすべて明示的に必要としているのか、それとも行列を疎にすることができるのかを検討してください。スパース行列のためのR(例えばMatrixパッケージを参照)には良いサポートがあります。

このサイズのオブジェクトを作る必要があるときは、R内の他のすべてのプロセスとオブジェクトを最小限に抑えてください。 gc()を使用して現在使用されていないメモリをクリアするか、もっと良い1回のセッションで必要なオブジェクトだけを作成する

上記の方法で解決できない場合は、必要なだけのRAMを搭載した64ビットマシンを入手し、64ビットRをインストールしてください。

それができなければ、リモートコンピューティングのためのオンラインサービスはたくさんあります。

それができない場合は、パッケージff(またはSaschaが述べているようにbigmemory)のようなメモリマッピングツールを使用すると、新しいソリューションを構築するのに役立ちます。私の限られた経験ではffがより高度なパッケージですが、CRANタスクビューのHigh Performance Computingトピックを読むべきです。

65
mdsumner

Windowsユーザーにとって、以下は私がいくつかのメモリ制限を理解するのに非常に役立ちました:

  • rを開く前に、Windowsのリソースモニタを開きます(Ctrl-Alt-Delete /タスクマネージャの起動/パフォーマンスタブ/下のボタン「リソースモニタ」/メモリタブをクリック)。
  • rを開く前、そしてどのアプリケーションによって、RAM memory usalreadyがどれだけ使用されたかがわかります。私の場合、合計4GBのうち1.6GBが使用されています。だから私はRのために2.4GBしか手に入れることができないでしょう、しかし今もっと悪化します...
  • rを開き、1.5 GBのデータセットを作成し、そのサイズを0.5 GBに縮小すると、リソースモニターにmy RAMが約95%で使用されていることが示されます。
  • ガベージコレクションを行うためにgc()を使用する=>それは動作します、私はメモリ使用量が2 GBに下がるのを見ることができます

enter image description here

私のマシンに作用する追加のアドバイス:

  • フィーチャを準備し、RDataファイルとして保存し、Rを閉じ、Rを再度開き、トレインフィーチャをロードします。リソースマネージャは通常、低いメモリ使用量を表示します。つまり、even gc()はすべての可能なメモリを回復するわけではなく、Rのクローズ/再オープンは最大使用可能メモリから始めるのが最善です。
  • もう1つのトリックは、トレーニングのために電車セットのみをロードすることです(通常は電車セットの半分のサイズになる可能性があるテストセットをロードしないでください)。トレーニング段階では最大(100%)までメモリを使用できるため、利用可能なものはすべて役立ちます。私がRメモリの限界を実験しているので、これはすべて塩の粒で取ることです。
44
tucson

これは、このトピックに関するプレゼンテーションです。興味深いことがあります。

http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/

私は自分で議論したことを試したことはありませんが、bigmemoryパッケージはとても便利なようです

15
Sacha Epskamp

この制限を回避する最も簡単な方法は、64ビットRに切り替えることです。

12
David Heffernan

私は同様の問題に遭遇し、私は 'ReadyBoost'として2つのフラッシュドライブを使いました。 2つのドライブは(キャッシュのために)メモリをさらに8GB増やすことで問題を解決し、システム全体の速度も向上させました。 Readyboostを使用するには、ドライブを右クリックしてプロパティを開き、[ReadyBoost]を選択して[このデバイスを使用する]ラジオボタンを選択し、[適用]または[OK]をクリックして設定します。

11
Kwaku Damoah

スクリプトをLinux環境で実行している場合は、次のコマンドを使用できます。

bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"

そして、サーバはあなたに代わって要求されたメモリを割り当てます(サーバの制限によるが、良いサーバでは - 巨大なファイルを使うことができます)。

7
nurit

私はmemor.limitのヘルプページをたどり、私のコンピュータRではデフォルトで最大1.5 GBのRAMを使用でき、ユーザーはこの制限を増やすことができることを知りました。次のコードを使用して

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)

私は私の問題を解決するのを助けました。

4
Rajib Kumar De

上記の保存/読み込み方法は私にはうまくいきます。 gc()がどうやってメモリをデフラグするのかわからないけど、これでうまくいくようです。

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
2
Simon Woodward