处理大型XML文件

5

我有一个包含许多子元素的大型XML文件。我希望能够运行一些XPath查询。我尝试在Java中使用VTD-XML,但有时会出现内存不足错误,因为XML文件太大而无法放入内存中。是否有其他处理如此大的XML文件的替代方法。


为什么这个问题打了Python标签?您是希望别人提供Python解决方案吗? - Spaceghost
当解析文档或尝试xpath查询时,您是否遇到内存错误?如果是后者,问题可能出在xpath查询上。无论哪种情况,您是否尝试增加JVM堆的-Xmx值? - Spaceghost
尝试使用扩展的vtd-xml,并使用内存映射选项。 - vtd-xml-author
5个回答

2

SAXParser 在处理大文件时非常高效。


1
你无法直接将XPath与SAX流一起使用(除非为每个查询重新解析整个文件)。 - Glenn Maynard
@Glenn Maynard - 但是肯定的是,OP每个查询(或一批查询)都必须重新解析文件。DOM太大了,无法放入内存中。 - Stephen C

2

你现在想做什么?听起来你正在尝试使用基于DOM的解析器,这将整个XML文件加载到内存中作为DOM表示。如果你处理的是大型文件,最好使用SAX解析器,以流式处理XML文档。

我个人推荐StAX


2

0
你使用标准的vtd还是扩展的VTD-xml?如果使用扩展XML,则可以选择使用内存映射...你尝试过这个选项吗?

0

如果您计划在长期运行的应用程序中动态编译许多表达式,则使用XPath可能不是一个很好的选择。

我不确定XPath的Java版本如何工作,但在.NET中,XPath会编译一个动态程序集,然后将其添加到应用程序域中。随后使用该表达式时,会查看现在加载到内存中的程序集。
在某些情况下,我使用XPath导致了一种情况,我认为这种机制类似于慢慢填满内存的内存泄漏。

我的理论是,由于每个表达式都是使用用户的值编译的,因此每个编译的表达式都是唯一的,因此新的表达式被编译并添加到应用程序域中。
由于可以从应用程序域中删除程序集而无需重新启动整个应用程序域,因此每次评估表达式时都会消耗内存,并且无法恢复。结果,代码以内存中的程序集形式泄漏内存,过一段时间后,您知道结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接