- ベストアンサー
ArrayListの要素数の上限
java で ArrayListの要素数の上限はいくつでしょうか? ネットで検索したところ C# の ArrayList は 2^32 - 1 のようですけど・・・。 たて、よこ 2^64 の巨大な実数値行列があって、これの固有値を求めるプログラムを作ることになっています。 最初は double の2次元配列で行列を作ろうと思ったのですが、double配列の要素数は 2^32-1 個が限界であきらめました。別の方法を探しているところなのです。 パソコンのメモリは24GBにしてOSも64bit Windowsにしたので java が対応できれば大丈夫かと思うのですが・・・ よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
JavaのArrayListもインデックス値はintを使っているようですので、2^32個になると思います。 (C++のstd::mapならsize_tなので64bit化は可能。) ただ2^32個のdouble(8バイト)は その値を格納するだけで32GBのメモリーが必要です。 このような巨大なデータを扱う場合は HDD等のストレージを利用した方が良いと思います。 0000100000.dat 0~1000000のデータを格納(8メガバイト) 0000200000.dat 0000300000.dat 0000400000.dat >たて、よこ 2^64 の巨大な実数値行列 仮に2^64個のdouble値データが存在するとして、それを保存するストレージはあるでしょうか? 100EBを超えると思います。 ※もし、データの存在率が低いのであればキーをx,yとするHashMap等を使った方が良いかもしれません。
その他の回答 (1)
- salsberry
- ベストアンサー率69% (495/711)
ArrayListクラスのsize()の返値型やget()の引数型がintなので、2^31か2^31-1が上限でしょう。 > たて、よこ 2^64 の巨大な実数値行列 まともにこのサイズのdoubleの2次元行列を作ると、2^131バイトのメモリを必要とします(64+64+3=131)。 2008年に全世界で出荷されたHDDの数が5億台強 (≒2^29) だということですから、それら全てが1TBの容量を持っていたと仮定しても、合計でたった2^69バイトです。24GBメモリ、64ビットWindowsくらいじゃ全く太刀打ちできませんね。 行列自体は巨大だが、ほとんど全ての要素の値が0である(疎行列)などの条件がつかないと、現代のコンピュータでは扱えないと思います。
お礼
非常に分かり易い説明をありがとうございます。 地球全体のHDDでもだめとは・・ (たとえも分かり易くて面白かったです!)
お礼
ありがとうございます。 > ただ2^32個のdouble(8バイト)はその値を格納するだけで32GBのメモリーが必要です。 なんと! > ※もし、データの存在率が低いのであればキーをx,yとするHashMap等を使った方が良いかもしれません。 なるほど。HashMapってそういう意義もあるのですね。 大変勉強になりました。