0
0

java配列の添字の最大値

Posted at

配列の添字の最大値

processing4で配列の添字に大きな値を入れるとエラーになるので、限界を探す。

以下のコードは文法エラーが起きない

int[] array = new int[2147483647];

しかし、以下のコードは文法エラーが起きる

int[] array = new int[2147483648];
//The literal 2147483648 of type int is out of range 

この数字はint型の最大値であり、32bit(もしくは4Byte)精度の最大値ともいえる。
(2^32)/2 = 2147483648
(マイナスも使うから半分)

だが、実行してみると、エラーになる。

int[] array = new int[2147483647];
//OutOfMemoryError: You may need to increase the memory setting in Preferences.

エラーにならない最大値は、2小さい2147483645。

int[] array = new int[2147483645];

processingの設定でメモリサイズを大きくしても効果なし。
javaのVMの制限なのか、macの制限なのかよくわからない。

メモリをどのぐらい使うのかということについては、byte[2147483648]のサイズは2GBなので、int[2147483648]だと8GB消費するはず・・・だが、macはメモリを自動で圧縮するので、中身を使っていたり使っていなかったりで、実使用メモリがどうなるかよくわからない。

解決策?

とりあえず、これよりも大きな数字を使いたい場合は、2次元配列にする必要がある。

int[][] array = new int[2147483645][256];

この1行だけなら実行はできたが、2TBのメモリを使うはずなので、おそらく使い物にはならないだろう。※このPCは32GB搭載機。
これ以上を狙うなら、スパコンのような搭載メモリが尋常ではない環境とか、SSDをメモリのように使うソフト入れるとか、自分で、ファイルアクセスで、そういう機能をつけるとか。いずれにしても面倒そうな環境を整える必要がある。もちろんプログラムを改良する必要が生じる。

結論

java仕様でlongの数値を添え字に使えないわけだが、java言語仕様として使えたとしても、そんな大容量メモリを搭載してないだろうから、いらないだろう、ということか。必要なら、二次元配列にすれば、いいだろ。という設計者の考えと理解した。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0