R 'Memory-limits' のドキュメントによると、長さが 2^31-1 を超えるベクトルを割り当てることはできません。これは、インデックスとして使用される整数が 31 ビット (符号用に 1 ビット) しか使用できないためです。しかし、64 ビット システムでは、より長いベクトルを割り当てることができるはずです。Rが64ビットシステムでこれと同じ最大長を課すのはなぜですか? 制限を回避する方法はありますか?
2 に答える
R の開発バージョンを使用する場合は、この機能を実験的にサポートできます。http://stat.ethz.ch/R-manual/R-devel/doc/html/NEWS.htmlから:
長いベクトル
64 ビット プラットフォームで 2^31 - 1 要素より長いベクトルのサポートが開始されました。これは、raw、logical、integer、double、complex、文字ベクトル、およびリストに適用されます。(文字ベクトルの要素は 2^31 - 1 バイトに制限されたままです。)
すべての側面は現在実験的です。
このようなベクトルでできることは、現在いくらか制限されており、ほとんどの操作で「長いベクトルはまだサポートされていません」というエラーが返されます。それらはシリアル化および非シリアル化、強制、同一()およびobject.size()が機能し、平均を計算できます。それらの長さは xlength() によって取得および設定できます。長いベクターで length() を呼び出すと、エラーがスローされます。
インデックス作成のほとんどの側面が利用可能です。一般に、2 ^ 31 - 1 を超える要素にアクセスするには、double-valued インデックスを使用できます。
詳細については、リンクを参照してください。私はこれを自分でまったく試していないので、実際に役立つかどうかについてコメントすることはできません.
http://developer.r-project.org/R_svnlog_2011 (およびhttp://developer.r-project.org/R_svnlog_2012 )にアクセスして「長いベクトル」を検索すると、その作業の感覚をつかむことができます。進んでいます。
ベンの答えを補足するいくつかの詳細があります。制限は、Rの構築に使用される低レベルのプログラミング言語、特に(明らかに)FORTRANコードから継承されているようです。したがって、明らかに、64ビットアドレス指定システムを最大限に活用できるようにRを移行することは主要なプロジェクトになるでしょう。
R-adminマニュアルから:
Rの64ビットビルドでも、Rオブジェクトのサイズに制限があり(help( "Memory-limits"を参照)、その一部は32ビット整数の使用に起因します(特にFORTRANコード)。すべてのビルドで。 Rの場合、ベクトルの最大長(要素数)は2 ^ 31-1、約20億であり、64ビットビルドでは、割り当てられるメモリブロックのサイズは2 ^ 34-1バイト(8GB)に制限されます。 )これらは最終的に引き上げられると予想されます*が、8GBオブジェクトの必要性は(これが2011年に作成されたとき)例外的です。
*
(マニュアルには、「このコメントは2005年からマニュアルに含まれている」と記した、厄介な脚注もあります。:)