2

コメント行で次のエラーが発生します。

"OutOfMemoryError: Java heap space" 

data.bin ファイルは巨大であるため、このエラーは予期されたものです。私の質問は、このエラーを正確に回避するにはどうすればよいですか? -Xmx1024m などのようなものを見たことがありますが、 jgraspコンパイラを使用してそれを実行する方法がわかりません

 try {
    RandomAccessFile data = new RandomAccessFile("data.bin","rws");
    long l = data.length();
    long recs = l / 1024;
    long cnt = 0;
    byte []b = new byte[1024];

    while(cnt < recs){
       cnt++;
       data.readFully(b);
       byte []key = Arrays.copyOfRange(b, 0, 24);
       byte []value = Arrays.copyOfRange(b, 24, 1024);
       en = new TEntry<String, String>(new String(key), new String(value));//ERROR
       lst.add(en);
    }
4

3 に答える 3

2

次のコマンドを使用して、ヒープ/スタック サイズを増やすことができます。

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

こちら でよりわかりやすい回答を見つけることもできます。

于 2013-05-03T05:11:03.820 に答える
1

必要に応じて、使用可能なメイン メモリの境界内でヒープの最小サイズと最大サイズを設定する必要があります。これを行うには、次のパラメーターを Java ランタイムに追加します -J-Xmx1024m -J-Xms512m

Windows を使用していますか? インストールフォルダーに「winconfig.exe」というファイルがあり、ダブルクリックするとヒープを変更できます。Linux または Mac OS を使用している場合は、おそらく似たような名前になっています (「config」という単語が含まれています)。

jgrasp -J-Xmx512m -J-Xms512m

于 2013-05-03T05:12:55.843 に答える
0

ファイル全体をメモリにロードしようとしています。バイトを文字列に変換すると、ファイルのサイズが 2 倍強になります。(文字列は 16 ビット文字を使用します) これを実行するのに十分なメモリがある (この場合は最大値を増やします) か、プログラムが実行するときに変更する必要があります。

すべてのキーと値を読み込もうとする代わりに、値だけを読み込んで、それらの値がどこにあるかを覚えておくことができます。つまり、その値のオフセットをファイルに保存します。

再度値を参照するときは、必要に応じて値を読み取る必要があります。この場合、必要なメモリを 20 分の 1 に減らすことができます。

于 2013-05-03T05:52:20.393 に答える