私はEclipseLinkMOXyで楽しい時間を過ごし、Spring内でXMLをPOJOに解析するための最良の方法を考え出しました。解析するXMLが与えられましたが、ファイルのサイズは信じられないほど750MiBになります。
EclipseLink MOXyはその下でストリーミング技術を使用しますか、それともドキュメント全体をメモリに保持しようとしますか?
私はEclipseLinkMOXyで楽しい時間を過ごし、Spring内でXMLをPOJOに解析するための最良の方法を考え出しました。解析するXMLが与えられましたが、ファイルのサイズは信じられないほど750MiBになります。
EclipseLink MOXyはその下でストリーミング技術を使用しますか、それともドキュメント全体をメモリに保持しようとしますか?
注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。
可能な限り、 EclipseLink JAXB(MOXy)はStAXを利用しXMLStreamReader
てXML入力を処理します。これは、ドキュメントがメモリに保持されないことを意味します。
MOXyと他のJAXB実装についてコメントすることはできませんが、XMLファイルの構造とそれに含まれるデータの種類によっては、XMLファイル全体をオブジェクトに非マーシャリングするという明白なアプローチ以外の方法を検討することをお勧めします。フロントしてからそれらを操作します。たとえば、非常に大きなファイルが多くの小さなセグメントで構成されている場合
<root>
<record>
<id>1</id>
<name>Ian</name>
</record>
<record>
<id>2</id>
<name>Deejay</name>
</record>
<!-- 100,000 more <record> elements -->
</root>
次のようなものを使用して、各セグメントを個別に処理できる場合があります。
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xsr = xif.createXMLStreamReader(inputStream);
JAXBContext ctx = JAXBContext.newInstance("com.example");
Unmarshaller um = ctx.createUnmarshaller();
xsr.nextTag(); // move to the <root> tag
xsr.nextTag(); // move to the first <record>
// read one <record> at a time
JAXBElement<Record> rec = um.unmarshal(xsr, Record.class);
// leaves the xsr pointing to the token after the </record> tag
// so you can do something with this Record, then discard it and
// parse the next...