我正在使用XOM库解析文件。 Java应用程序运行良好但我在解析超过200 MB的大文件时遇到了内存问题。
当我使用下面的代码
构建文件时,我面临堆大小的内存 Builder profileFileBuilder = new Builder(profileFileXMLReader);
Document profileFileDocument = profileFileBuilder.build(profileFile);
构建具有该大小的文件有哪些替代方法?我试图为JVM分配更多内存,但它不接受超过1024 MB
提前谢谢
答案 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