私は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
このデータをすべて明示的に必要としているのか、それとも行列を疎にすることができるのかを検討してください。スパース行列のためのR(例えばMatrix
パッケージを参照)には良いサポートがあります。
このサイズのオブジェクトを作る必要があるときは、R内の他のすべてのプロセスとオブジェクトを最小限に抑えてください。 gc()
を使用して現在使用されていないメモリをクリアするか、もっと良い1回のセッションで必要なオブジェクトだけを作成する。
上記の方法で解決できない場合は、必要なだけのRAMを搭載した64ビットマシンを入手し、64ビットRをインストールしてください。
それができなければ、リモートコンピューティングのためのオンラインサービスはたくさんあります。
それができない場合は、パッケージff
(またはSaschaが述べているようにbigmemory
)のようなメモリマッピングツールを使用すると、新しいソリューションを構築するのに役立ちます。私の限られた経験ではff
がより高度なパッケージですが、CRANタスクビューのHigh Performance Computing
トピックを読むべきです。
Windowsユーザーにとって、以下は私がいくつかのメモリ制限を理解するのに非常に役立ちました:
gc()
を使用する=>それは動作します、私はメモリ使用量が2 GBに下がるのを見ることができます私のマシンに作用する追加のアドバイス:
これは、このトピックに関するプレゼンテーションです。興味深いことがあります。
http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/
私は自分で議論したことを試したことはありませんが、bigmemory
パッケージはとても便利なようです
この制限を回避する最も簡単な方法は、64ビットRに切り替えることです。
私は同様の問題に遭遇し、私は 'ReadyBoost'として2つのフラッシュドライブを使いました。 2つのドライブは(キャッシュのために)メモリをさらに8GB増やすことで問題を解決し、システム全体の速度も向上させました。 Readyboostを使用するには、ドライブを右クリックしてプロパティを開き、[ReadyBoost]を選択して[このデバイスを使用する]ラジオボタンを選択し、[適用]または[OK]をクリックして設定します。
スクリプトをLinux環境で実行している場合は、次のコマンドを使用できます。
bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"
そして、サーバはあなたに代わって要求されたメモリを割り当てます(サーバの制限によるが、良いサーバでは - 巨大なファイルを使うことができます)。
私はmemor.limitのヘルプページをたどり、私のコンピュータRではデフォルトで最大1.5 GBのRAMを使用でき、ユーザーはこの制限を増やすことができることを知りました。次のコードを使用して
>memory.limit()
[1] 1535.875
> memory.limit(size=1800)
私は私の問題を解決するのを助けました。
上記の保存/読み込み方法は私にはうまくいきます。 gc()
がどうやってメモリをデフラグするのかわからないけど、これでうまくいくようです。
# defrag memory
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")