配列の添字の最大値
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言語仕様として使えたとしても、そんな大容量メモリを搭載してないだろうから、いらないだろう、ということか。必要なら、二次元配列にすれば、いいだろ。という設計者の考えと理解した。