java byte[]上限
javaのbyte[]でファイルのbyteデータを扱うことはよくあるが、byte[]で扱えないデータ数を扱う場合、どのような方法があるか検討しました。
実施するうえで、実行環境のスペックが大きくかかわっていると思われるので、掲載する(違ったらごめんなさい。自分は動けばいいと思ったので、詳しく調査は行わないです)。
- メモリ:16GB
- STS(Eclipse)のメモリ割り当て:-Xms4096m,-Xmx6120m
- -Xms1024m,-Xmx2048mにもしてみたが成功したため、実際のPCスペックに依存するかもしれない。
やってみた
- 6.2GBのバイナリファイルを1GBずつ読み込み、計7GBのbyte[]のデータを保持。細かい動作は割愛。
- byte[]では配列上限(int上限の2,147,483,647)までで処理が落ちる。そのため、byte[][]を定義。空き容量があり続ける限りほぼ無限に近い値を保持できる(理論上int上限の2乗)。
File inputFile = new File("./6gb.bin"); // ファイル
long splitSize1 = 1L * 1024 * 1024 * 1024; // 1GBのファイルサイズ
try( FileInputStream ins= new FileInputStream(inputFile);){
byte[][] bytes = new byte[7][]; //定義時にlist[]に容量を確保。
byte[] readByte = new byte[(int) splitSize1];
int read;
for(int i = 0; i < 7; i++) {
while(( read = ins.read(readByte)) != -1) {
bytes[i] = readByte;
break;
}
}
System.out.println(bytes.length);
//byte[] のサイズ:7
for(byte[] item : bytes) {
System.out.println(item.length);
//byte[i][] のサイズ:1073741824(1GB)*7回表示
}
} catch (Exception e) {
e.printStackTrace();
}
検証結果
上記を行った結果、計7GBのbyte[][]を扱うことができたが、メモリ割り当てを低くした場合でも、ヒープエラーなどの異常終了が見られなかったため、PCスペックにもよるのかなといった認識です。
参考文献
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html