非常に大きなXML文字列を読み込んでDocumentオブジェクトに変換するときに、メモリ不足の例外が発生しています。BufferedReaderをByteArrayInputStreamに変換する際のメモリ使用量を改善する方法は?
私がこれをやっているのは、XMLファイルのURLストリームを開いてInputStreamReaderでラップし、BufferedReaderでラップすることです。
は、それから私はBufferedReaderのから読み取られたStringBufferに追加:
StringBuffer doc = new StringBuffer();
BufferedReader in = new BufferedReader(newInputStreamReader(downloadURL.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
doc.append(inputLine);
}
今これは私が問題を抱えてい一環です。私はByteArrayInputStreamを作成するために使用されるバイト配列を作成するためにバイトを取得できるように、StringBufferのtoStringを使用しています。私はこのステップが私にメモリ内で同じデータを2回持たせていると信じています。ここで
は私がやっているものです:
byte xmlBytes[] = doc.toString().getBytes();
ByteArrayInputStream is = new ByteArrayInputStream(xmlBytes);
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
Builder xmlBuilder = new Builder(xmlReader,false);
Document d = xmlBuilder.build(is);
を私は(私が最初の場所でそれをやっている場合)、重複メモリの作成を回避することができますまたはストレートにBufferedReaderのを変換する方法がある方法はありますByteArrayInputStream?
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document document = builder.parse(inputStream);
これはあまり仲介コピーを作成します。ここでは
おかげ
"重複メモリ"は作成していません。あなたはあなたの記憶のすべてを持っています。このStringBufferはどこに行きたいのですか? –
私が言ったのは、同じデータをメモリに2回作りましたか?最終的には、Documentオブジェクトにデータが必要です。 – Seephor