2016-08-01 9 views
0

700MBのファイルから数バイト(たとえば、1 MB、2 MBなど)を読み込む必要があります。大きなテキストファイルからいくつかのバイトを読み込もうとしていますJava

私はいくつかのアプローチを試みたが、それらの皆に私が取得:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 

私はJDK 8つのストリーム使用してみました:InputStream/OutputStreamを使用して

try (Stream<String> lines = Files.lines(Paths.get("myfilename"), 
             Charset.defaultCharset())) { 
    lines.forEachOrdered(line -> doSomething(line)); 
} 

とも:

InputStream is = new FileInputStream("myfilename"); 
    ByteArrayOutputStream result = new ByteArrayOutputStream(); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = is.read(buffer)) != -1) { 
     result.write(buffer, 0, length); 
    } 
    is.close(); 
    return result.toString("UTF-8"); 

私には何かがありますか? ありがとう!

はい、バイナリファイルです。これは問題です...どうすればその部分を読むことができますか?

+0

を割り当てられて割り当てられました。また、ファイル全体を一度に開こうとしているときに私たちに表示していないコードが他にはないことは確かです。最悪の場合:プロファイラを使用して、メモリがどこに行くのかを理解してみてください。 – GhostCat

+3

正確に何を達成したいですか? JVMに割り当てられたメモリに収まらないメモリにファイル全体をロードするので、ここでOOMEを取得します –

+2

バイナリファイルを読み込んでいますか? lazilyにストリームされた 'Files.lines()'は、行の終わりがプラットフォーム固有の行区切り記号によって決まるので、テキストファイルでのみ使用できます。この方法でバイナリファイルをロードしようとすると、文字列変換エラーが発生していなければ、行末の最初のシーケンスまですべてのバイトが読み込まれます(存在する場合)。したがって、最初の行にOoMEが表示される可能性があります。 – charlie

答えて

0

32ビットモードでJVMを使用すると、割り当てられる最大ヒープサイズは1280 MBです。したがって、それを超えたい場合は、JVMを64モードで起動する必要があります。

てみJavaの実行のためのオプションを使用するには:メモリ分

のXMS =は=最大メモリ

Xmxのは

ちょっと奇妙である
JVM_ARGS="-d64 -Xms1024m -Xmx15360m " 
jdk1.X/bin/java $JVM_ARGS -jar myprogram.jar 
関連する問題