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


149

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

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

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

どうすればこれを回避できますか?私の主な問題は、スクリプトの特定のポイントに到達し、Rがオブジェクトに200〜300 Mbを割り当てることができないことです...他の処理にメモリが必要なため、ブロックを実際に事前に割り当てることはできません。これは、不要なオブジェクトをこまめに削除した場合でも発生します。

編集:はい、申し訳ありません:Windows XP SP3、4 Gb 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

'free'を使用して、使用されていない他のプロセスのメモリの割り当てを解除してみてください。
Manoel Galdino、2011年

5
@マノエルガルディーノ:「無料」とは何ですか?R関数?
ベンジャミン

3
@マノエル:Rでは、メモリを解放するタスクは、ユーザーではなくガベージコレクターによって処理されます。Cレベルで作業している場合は、手動CallocFreeメモリを使用できますが、これはベンジャミンが行っていることではないようです。
シャルピー

ライブラリXMLでは無料で使用できます。ドキュメントから:「この汎用関数は、指定されたオブジェクトに関連付けられたメモリを明示的に解放するために使用できます。これは、ネイティブオブジェクト。」
Manoel Galdino、2011

回答:


78

このすべてのデータを明示的に必要とするのか、それとも行列を疎にすることができるのかを検討してください。R(Matrixスパース行列など)のサポートが充実しています。

このサイズのオブジェクトを作成する必要がある場合は、Rの他のすべてのプロセスとオブジェクトを最小限に抑えます。gc()現在使用されていないメモリをクリアするために使用するか、1回のセッションで必要なオブジェクトのみを作成することをお勧めします

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

それができない場合は、リモートコンピューティング用の多くのオンラインサービスがあります。

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


1
タスクは、randomForestを使用した画像分類です。randomForestにフィードするには、トレーニングデータのマトリックス(最大60バンド)と20,000から6,000,000行の範囲が必要です。結果のrandomForestオブジェクトを保持するために隣接するブロックが必要なため、現在最大で約150,000行です。これは、randomForestが行列オブジェクトを必要とするため、bigmemoryが役に立たない理由でもあります。
ベンジャミン

「必要なオブジェクトのみを1つのセッションで作成する」とはどういう意味ですか?
ベンジャミン

'a'を1度だけ作成します。間違った場合は、新しいセッションを開始します
mdsumner

1
多くの計算が行われるが出力が比較的小さい大きなループを含むプログラムの場合は、Rscriptを介して(BASHまたはPythonスクリプトから)ループの内部を呼び出す方がメモリ効率が高くなる可能性があることを追加します、結果を別のスクリプトで照合/集計します。このようにして、各反復後にメモリが完全に解放されます。ループに渡された変数を再読み込み/再計算することによって計算が無駄になりましたが、少なくともメモリの問題は回避できます。
ベンジャミン

54

Windowsユーザーの場合、次のことはいくつかのメモリ制限を理解するのに大いに役立ちました。

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

ここに画像の説明を入力してください

私のマシンで機能する追加のアドバイス:

  • 機能を準備し、RDataファイルとして保存し、Rを閉じ、Rを再度開き、トレーニング機能を読み込みます。リソースマネージャーは通常、メモリ使用量が少ないことを示します。これは、gc()でも可能なすべてのメモリを回復するわけではなく、Rを閉じたり再度開いたりすると、利用可能な最大メモリで開始するのに最適です
  • もう1つのトリックは、トレーニング用にトレインセットのみをロードすることです(通常、トレインセットの半分のサイズのテストセットはロードしないでください)。トレーニングフェーズではメモリを最大(100%)まで使用できるため、利用可能なものは何でも役に立ちます。私はRのメモリ制限を実験しているので、これはすべて一粒の塩で行うことです。

9
Rはそれ自体でガベージコレクションを行いますが、これgc()は単なる幻想です。タスクマネージャのチェックは、Windowsの非常に基本的な操作です。私が同意できる唯一のアドバイスは、.RData形式で保存することです
David Arenburg

3
@DavidArenburg gc()は幻想ですか?それは、メモリ使用量の減少を示す上記の画像が幻想であることを意味します。あなたは間違っていると思いますが、私は間違っているかもしれません。
ティモシーヘンリー2014

4
それがうまくいかないという意味でgc()はありませんでした。Rが自動的に行うことを意味しているので、手動で行う必要はありません。こちらをご覧ください
デビッドアレンブルク14

2
@DavidArenburg上の画像のメモリ使用量の低下はgc()コマンドが原因であることをお伝えします。あなたが指しているドキュメントが正しいとは思わない、少なくとも私の設定ではそうではない(Windows、Rバージョン3.1.0(2014-04-10)プラットフォーム:i386-w64-mingw32 / i386(32ビット))。
ティモシーヘンリー2014

15
さて、最後に。gc() DOESの作品。Rは内部的それをしないので、あなたはそれを使用する必要はありません
デビッドArenburg


14

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


25
それは一般的に治療法ではありません-私は切り替えましたが、今ではError: cannot allocate vector of size ... Gb代わりに持っています(そうです、私はたくさんのデータを持っています)。
om-nom-nom 2012

2
多分治療法ではないかもしれませんが、それは多くを助けます。RAMにロードして、memory.limit()を増やし続けます。または、データのパーティション化/サンプリングについて考えてみてください。
random_forest_fanatic 2013

本質的に無制限の64ビットでも問題が発生する場合は、おそらく非常に大規模なものを割り当てようとしているだけではありません。理論上、ベクトルの大きさを計算しましたか?それ以外の場合は、コンピューターに追加のRAMが必要になる可能性がありますが、使用できる容量は限られています。
hangmanwa7id

このような単純なソリューションを試してから、壁に対抗するソリューションを試す前に試してみてください。ありがとう。
Nova

さらに、これはWindowsだけの問題ではありません。現在、Ubuntu、64ビットR、Matrixを使用していますが、20048 x 96448 Matrixオブジェクトの操作が困難です。

12

同様の問題が発生し、「ReadyBoost」として2つのフラッシュドライブを使用しました。2つのドライブにより、8GBのメモリ(キャッシュ用)がさらに追加され、問題が解決され、システム全体の速度も向上しました。Readyboostを使用するには、ドライブを右クリックしてプロパティに移動し、[ReadyBoost]を選択して[このデバイスを使用]ラジオボタンを選択し、[適用]または[OK]をクリックして構成します。


11

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

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

私の問題を解決するのに役立ちました。


1
なぜこれが否決されるのですか?確かに、それは危険なアプローチですが、それが機能するためにセッションに少しだけメモリを割り当てる必要がある場合に役立つことがあります。
Jeppe Olsen

3
これはWindows固有のソリューションです
Jinhua Wang

9

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

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

サーバーは要求されたメモリを割り当てます(サーバーの制限によると、サーバーが適切であれば-hugefilesを使用できます)


1
これをAmazon EC2インスタンスで使用できますか?もしそうなら、私は代わりに何を置きserver_nameますか?私はcannot allocate vector size...AMIで巨大なDocument-Term Matrixを実行しようとしてこれに遭遇し、なぜそれが十分なメモリを持たないのか、またはどれだけレンタルする必要があるのか​​理解できません。ありがとうございました!
seth127 2016年

私はUbuntuの初心者で、Rstudioを使用しています。16 GBのRAMがあります。回答に示されているプロセスをどのように適用しますか?ありがとう
runjumpfly 2016年

3

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

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.