33

R 'Memory-limits' のドキュメントによると、長さが 2^31-1 を超えるベクトルを割り当てることはできません。これは、インデックスとして使用される整数が 31 ビット (符号用に 1 ビット) しか使用できないためです。しかし、64 ビット システムでは、より長いベクトルを割り当てることができるはずです。Rが64ビットシステムでこれと同じ最大長を課すのはなぜですか? 制限を回避する方法はありますか?

4

2 に答える 2

25

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 )にアクセスして「長いベクトル」を検索すると、その作業の感覚をつかむことができます。進んでいます。

于 2012-05-17T18:14:11.200 に答える
18

ベンの答えを補足するいくつかの詳細があります。制限は、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年からマニュアルに含まれている」と記した、厄介な脚注もあります。:)

于 2012-05-17T18:26:49.813 に答える