2012-05-17 7 views
28

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

+7

この制限はR-3.0.0では削除されています。 –

答えて

24

開発版のRで作業する場合は、実験用にこの機能をサポートすることができます。 http://stat.ethz.ch/R-manual/R-devel/doc/html/NEWS.htmlから: - 64ビット・プラットフォーム上の1要素

LONG VECTORS

2^31よりも長いベクトルのためのサポートの始まりがあります。これは、生の、論理の、整数の の複素数、複雑な文字ベクトル、およびリストに適用されます。 ( の要素は2^31-1バイトに制限されたままです。)

すべての側面は現在実験中です。

このようなベクトルを使って行うことができるのは現在のところ であり、ほとんどの操作でエラー '長いベクトルはサポートされていません 'が返されます。それらはシリアライズされ、シリアライズされず、強制され、同一の() とobject.size()が働き、手段を計算することができます。長さは になります。xlength()で取得して設定します。長いベクトルでの呼び出し長さは にエラーを投げます。

インデックス作成のほとんどの側面が利用できます。通常、2^31 - 1を超える要素にアクセスするには、 の二重値インデックスを使用できます。

詳細はリンクを参照してください。私はこれをすべて自分で実験していないので、それが実際に有用であるかどうかについてはコメントできません。

http://developer.r-project.org/R_svnlog_2011(およびhttp://developer.r-project.org/R_svnlog_2012)にアクセスし、「長いベクトル」を検索すると、進行中の作業の感覚を得ることができます。

+6

svnログをスキャンすることをお勧めします。この仕事をしているのは本質的に「暴動、暴力、暴力、...」であることがわかりましたので、[この投稿](http://dirk.eddelbuettel.com/blog/2007/08/11/)を私に思い出させます日。 –

15

ここに、Benの答えを補完する詳細がいくつかあります。制限は、Rを構築するために使用される下位レベルのプログラミング言語、特に(明らかに)FORTRANコードから継承されるように見えます。だから明らかに、64ビットアドレッシングシステムを最大限に活用できるようにRを移行することは、大きなプロジェクトになるでしょう。の使用から生じるいくつかのRオブジェクトのサイズに関する制限(ヘルプ(「メモリーの制限」を参照)がある64ビットRのビルドさえ上

R-admin manualから

Rのすべてのビルドでは、ベクトルの最大長(要素数)は2^31-1、約20億、64ビットではブロックのサイズが構築されます割り当てられたメモリの容量は2^34-1バイト(8GB)に制限されていますが、これらは最終的には上げられると見込まれています*ただし、8GBのオブジェクトの必要性は例外的です(2011年に書かれた場合は例外です)。

(このマニュアルでは、脚注に「*」と書いてありますが、「このコメントは2005年からマニュアルに載っています」と書いてあります。 :)