プロが教えるわが家の防犯対策術!

java で ArrayListの要素数の上限はいくつでしょうか?
ネットで検索したところ C# の ArrayList は 2^32 - 1 のようですけど・・・。

たて、よこ 2^64 の巨大な実数値行列があって、これの固有値を求めるプログラムを作ることになっています。

最初は double の2次元配列で行列を作ろうと思ったのですが、double配列の要素数は 2^32-1 個が限界であきらめました。別の方法を探しているところなのです。

パソコンのメモリは24GBにしてOSも64bit Windowsにしたので java が対応できれば大丈夫かと思うのですが・・・

よろしくお願いします。

A 回答 (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等を使った方が良いかもしれません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

> ただ2^32個のdouble(8バイト)はその値を格納するだけで32GBのメモリーが必要です。

なんと!

> ※もし、データの存在率が低いのであればキーをx,yとするHashMap等を使った方が良いかもしれません。

なるほど。HashMapってそういう意義もあるのですね。

大変勉強になりました。

お礼日時:2010/02/18 14:05

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である(疎行列)などの条件がつかないと、現代のコンピュータでは扱えないと思います。
    • good
    • 0
この回答へのお礼

非常に分かり易い説明をありがとうございます。

地球全体のHDDでもだめとは・・
(たとえも分かり易くて面白かったです!)

お礼日時:2010/02/18 14:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A