2012-04-02 10 views
4

です。ネットワーク解析にはigraphを使用しています。その一環として、2つの列とリンクがある行を持つ行列を作成する必要があります。私は大規模なネットワーク(数百万のリンク)を持っていて、このマトリックスを作成しても、3時間の実行時間後には動作しませんでした(エラーなし、結果なし、 "応答していません")。マトリックスの最大サイズはR

このような文字マトリックスの最大サイズはいくらですか?走るのにどれくらい時間がかかりますか?

私は2.67 GHzで動作してメモリの4ギガバイトでWindows 7マシンで、64ビットのR 2.14.1を実行しています

おかげ

は、迅速な対応のための 感謝を追加しました。これは行列の大きさではないことを私に肯定しました。それは、別の行列の列がその行列を作成するために使用していた誤差であることが判明しました。

+0

行列を作成する方法を具体的に説明できますか? – Tommy

+0

@Tommy私の部分ではエラーになりました –

答えて

11

Rのベクトルの理論的限界は、2147483647要素です。したがって、これは約10億行/ 2列です。

...しかし、その量のデータは4 GBのメモリに収まりません。特に、文字ベクトルの文字列ではそうではありません。各文字列は少なくとも96バイト(object.size('a') == 96)であり、行列の各要素はそのような文字列へのポインタ(8バイト)になります(ただし、各一意の文字列のインスタンスは1つだけです)。

通常、マシンは仮想メモリの使用を開始し、スワッピングを開始します。重いスワッピングは、今世紀には、特にWindows上で終わるすべての希望を打ち消します。

しかし、パッケージ(igraph?)を使用していて、行列の作成を依頼していると、おそらく多くの内部作業が行われ、多くの補助オブジェクトが作成されます。したがって、単一の結果行列のメモリの限界近くにいなくても、それを生成するために使用されるアルゴリズムはメモリ不足になる可能性があります。それは時間的に非線形(二次的またはより悪い)であることもあり、これは今世紀にこれまでに完了したすべての希望を再び殺します。 system.timeを使用して)、そしてグラフサイズを2倍に倍増するときに再び。次に、時間が線形か二次式かを確認し、大きなグラフを完成させるのにどれくらい時間がかかるかを見積もることができます。予測が1週間だと言うと、よく分かります;-)

+1

ベクトルにあるオーバーヘッドがあります。オブジェクトのsize.size(character(n))/ nは文字が8バイトであることを示しています。 – James

+2

@James - True。文字列のサイズは、8文字ごとに8ずつ増加します。したがって、 'object.size( 'abcdefgh')== 104'(64ビットシステム上) – Tommy

2

R個の行列は実際には長さ2のdim属性を持つベクトルであり、R個のベクトルは符号付き32 64ビットバージョンを使用していても、-bit整数になります。そのため、2列の行列は最大で2^30-1行になります。

data.frameは、2^31-1の行と列を使用できます。