XOM Parser堆内存

时间:2014-01-27 15:11:54

标签: java xml-parsing xom

我正在使用XOM库解析文件。 Java应用程序运行良好但我在解析超过200 MB的大文件时遇到了内存问题。

当我使用下面的代码

构建文件时,我面临堆大小的内存
        Builder profileFileBuilder = new Builder(profileFileXMLReader);
        Document profileFileDocument = profileFileBuilder.build(profileFile);

构建具有该大小的文件有哪些替代方法?我试图为JVM分配更多内存,但它不接受超过1024 MB

提前谢谢

2 个答案:

答案 0 :(得分:1)

根据您对文档的处理方式,一种替代方法可能是从基于DOM的处理切换到基于SAX的处理(或其他事件驱动的序列化程序接口)。这将允许您使用内部存储器模型,该模型已根据您的需求进行调整,因此比一般DOM更高效,如果您可以从现有数据模型序列化或即时生成内容,则可能完全避免构建内存模型。

例如,Xalan XSLT处理器使用SAX解析器在内部构建自定义数据模型而不是DOM(XSLT,通常需要随机访问文档的内容,因此需要一些内存模型),以及只要有可能,就直接将输出产生到SAX串行器。

更进一步,可以设置一个数据模型,该模型明确地将文档的某些部分分页,然后指望操作系统的交换器。不过,我不确定这会是一场净胜利。

DOM是一件好事,请注意(他说,作为其作者之一) - 但作为一种通用工具,它并不是所有任务的理想答案。

BTW,在调试一些比较复杂的问题时,我经常将-Xmx设置为高于1024m。 Java是否允许您使用更高的值取决于JVM和您的操作系统配置,但我认为值得仔细检查是否可以将其推高一点。

答案 1 :(得分:1)

您可以通过扩展NodeFactory将XOM用作流式解析器,这样它就不会将XML保留在内存中,而是对其进行处理然后忘记它。这适用于具有包含在容器元素中的许多较小节点的XML。例如,XML如:

<records>
  <record><a_little_xml/></record>
  <record><a_little_xml/></record>
  <record><a_little_xml/></record>
  <record><a_little_xml/></record>
  <record><a_little_xml/></record>
</records>

XOM文档中有一个如何扩展NodeFactory的示例:http://www.xom.nu/tutorial.xhtml#Lister

您基本上解析内容(在您感兴趣的文档中的任何级别),然后不要将其添加到内存中的树:http://www.xom.nu/tutorial.xhtml#d0e1424