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
ベストアンサー1
このすべてのデータを明示的に必要とするかどうか、または行列をスパースにできるかどうかを検討してください。R にはMatrix
スパース行列に対する優れたサポートがあります (たとえば、パッケージを参照)。
このサイズのオブジェクトを作成する必要があるときは、Rの他のすべてのプロセスとオブジェクトを最小限に抑えてください。gc()
使用されていないメモリをクリアするには、1回のセッションで必要なオブジェクトのみを作成する。
上記の方法で問題が解決しない場合は、購入可能な範囲で最大の RAM を搭載した 64 ビット マシンを入手し、64 ビット R をインストールしてください。
それができない場合は、リモート コンピューティング用のオンライン サービスが多数あります。
それができない場合は、パッケージのようなメモリ マッピング ツールff
(またはbigmemory
Sascha が言及しているもの) を使用すると、新しいソリューションを構築できます。私の限られた経験では、ff
より高度なパッケージですが、High Performance Computing
CRAN タスク ビューに関するトピックを読む必要があります。