177

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、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
4

9 に答える 9

93

このすべてのデータが本当に明示的に必要かどうか、またはマトリックスがスパースになる可能性があるかどうかを検討してください。RMatrixでは、スパース行列が適切にサポートされています (たとえば、パッケージを参照)。

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

上記で解決できない場合は、余裕のある RAM を搭載した 64 ビット マシンを入手し、64 ビット R をインストールします。

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

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

于 2011-03-02T22:34:15.687 に答える
64

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()ガベージコレクションを行うために使用=>機能し、メモリ使用量が2GBに減少することがわかります

ここに画像の説明を入力

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

  • 機能を準備し、RData ファイルとして保存し、R を閉じ、R を再度開き、トレーニング機能を読み込みます。Resource Manager は通常、より低いメモリ使用量を示します。これは、gc() でさえすべての可能なメモリを回復するわけではなく、R を閉じて再度開くと、使用可能な最大メモリで開始するのが最適であることを意味します
  • もう 1 つのトリックは、トレーニング用にトレーニング セットのみをロードすることです (テスト セットはロードしないでください。通常、トレーニング セットの半分のサイズになる可能性があります)。トレーニング フェーズではメモリを最大限 (100%) 使用できるため、利用可能なものは何でも役立ちます。私は R のメモリ制限を実験しているので、これはすべて一粒の塩で取ることです。
于 2014-07-15T09:35:33.257 に答える
15

このトピックに関する興味深いプレゼンテーションを次に示します。

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

議論されたことを自分で試したことはありませんが、bigmemoryパッケージは非常に便利なようです

于 2011-03-02T18:32:15.987 に答える
12

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

于 2015-12-10T20:31:29.433 に答える
12

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

于 2011-03-03T20:14:08.583 に答える
8

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

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

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

于 2015-09-10T08:18:01.190 に答える