1. ホーム
  2. r

[解決済み] テスト

2022-01-28 20:44:54

質問内容

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

連続したメモリブロックの取得が困難なことと関係していると理解しています(から こちら ):

cannot で始まるエラーメッセージ サイズのベクターを割り当てることは メモリの取得に失敗しました。 サイズを超えたため プロセスのアドレス空間の制限、または より可能性が高いのは、システムが は、メモリを提供できない。注 32ビットのビルドでは 十分な空きメモリがあるが 十分な大きさの連続したブロックでない のアドレス空間へマッピングすることができます。

どうすれば回避できるのでしょうか?私の最大の難点は、スクリプトのある時点になると、Rがオブジェクトに200~300Mbを割り当てられないことです......。他の処理のためにメモリが必要なので、ブロックを事前に割り当てることができないんです。この現象は、不要なオブジェクトを削除しても発生します。

EDIT: はい、すみません: 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() を使用して未使用のメモリをクリアするか、より良い方法は 一回のセッションで必要なオブジェクトのみを作成する .

上記で解決できない場合は、64ビットマシンを用意し、余裕のある限りのRAMを搭載し、64ビットRをインストールしてください。

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

もし、それができないのであれば、メモリマップツールである package ff (または bigmemory Saschaが言及しているように)は、新しいソリューションを構築するのに役立ちます。私の限られた経験では ff は、より高度なパッケージですが、あなたが読むべきは High Performance Computing のトピックにあるCRAN Task Viewsを参照してください。