2010-12-29 16 views
0

確かに、私は試行錯誤でそれを理解することができたかもしれませんが、この数がどのように変わるか、どのように(コンピュータの性能、他のデータ構造が存在するか、コンパイラの種類など)ありがとう!OutOfMemoryエラーが発生しない最大サイズのマトリックスですか?

+4

はい、それは大きく異なります:-)しかし、配列の要素数*(絶対値)は[2^31-1]( 'int'の最大値は' Integer.MAX_VALUE'です)です。配列やintなどを使用する場合、他のデータ構造の*絶対*最大サイズも同様です。しかし、ほとんどの[コンシューマ]コンピュータは、単純に最大要素配列メモリ要件:-) 'int [2^32-1]'には16GB +(4バイト×4B)(そしてGCマークアンドスイープでカウントするので、おそらく32GB +?)が必要です。少なくともこれはアドレス空間のためだけに64ビットのVMを必要とします。 –

+0

要素の最大数は 'Integer.MAX_VALUE'ではなく、実際には' Integer.MAX_VALUE - 5'です。参照:http://stackoverflow.com/questions/3038392/do-java-arrays-have-a-maximum-size – Flimm

答えて

4

メモリ不足の場合は、JVMヒープサイズを大きくする必要があります。read thisヒープサイズを増やす以外に、(メモリリークがない場合に)行列に多くのメモリが必要な場合は、何もできません。

十分なメモリがある場合は、行列のサイズを必要に応じて大きくすることができます(ただし、インデックスとして使用される整数の最大値より大きくはできません)。整数は32ビットなので、そこでは理論上の最大限の制限があります。

1

最大配列サイズは32ビットの符号付き値によって制限されますが、すなわち2^31-1または約20億であり、大部分の行列は2次元配列として実装されるので、最大サイズは20億* 20億である。あなたはfloatまたはdoubleを使うことができますが、大きな行列があった場合、蓄積された丸め誤差は膨大になります。 〜2^62ビットで、これは倍精度の精度よりも高いので、どの場合でもBigDecimalを使用する必要があります。各セルに約128(2^7)バイトのメモリが必要だったとすると、合計2^69バイトまたは512 Exaバイト(64ビットプロセッサが処理できるメモリの理論上の制限の32倍)を必要とするとします。

0

また、マシンのメモリと、-Xmxを使用してプロセスに割り当てるメモリ量にも依存します。

関連する問題