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");
を
私には何かがありますか? ありがとう!
はい、バイナリファイルです。これは問題です...どうすればその部分を読むことができますか?
を割り当てられて割り当てられました。また、ファイル全体を一度に開こうとしているときに私たちに表示していないコードが他にはないことは確かです。最悪の場合:プロファイラを使用して、メモリがどこに行くのかを理解してみてください。 – GhostCat
正確に何を達成したいですか? JVMに割り当てられたメモリに収まらないメモリにファイル全体をロードするので、ここでOOMEを取得します –
バイナリファイルを読み込んでいますか? lazilyにストリームされた 'Files.lines()'は、行の終わりがプラットフォーム固有の行区切り記号によって決まるので、テキストファイルでのみ使用できます。この方法でバイナリファイルをロードしようとすると、文字列変換エラーが発生していなければ、行末の最初のシーケンスまですべてのバイトが読み込まれます(存在する場合)。したがって、最初の行にOoMEが表示される可能性があります。 – charlie