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

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

これは連続したメモリブロックを取得するのが難しいことに関係していると思います(ここ):

「サイズのベクトルを割り当てることができません」で始まるエラー メッセージは、サイズがプロセスのアドレス空間制限を超えたか、あるいはシステムがメモリを提供できなかったためにメモリを取得できなかったことを示します。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(またはbigmemorySascha が言及しているもの) を使用すると、新しいソリューションを構築できます。私の限られた経験では、ffより高度なパッケージですが、High Performance ComputingCRAN タスク ビューに関するトピックを読む必要があります。

おすすめ記事