我有一个包含许多子元素的大型XML文件。我希望能够运行一些XPath查询。我尝试在Java中使用VTD-XML,但有时会出现内存不足错误,因为XML文件太大而无法放入内存中。是否有其他处理如此大的XML文件的替代方法。
我有一个包含许多子元素的大型XML文件。我希望能够运行一些XPath查询。我尝试在Java中使用VTD-XML,但有时会出现内存不足错误,因为XML文件太大而无法放入内存中。是否有其他处理如此大的XML文件的替代方法。
SAXParser 在处理大文件时非常高效。
你现在想做什么?听起来你正在尝试使用基于DOM的解析器,这将整个XML文件加载到内存中作为DOM表示。如果你处理的是大型文件,最好使用SAX解析器,以流式处理XML文档。
我个人推荐StAX。
如果您计划在长期运行的应用程序中动态编译许多表达式,则使用XPath可能不是一个很好的选择。
我不确定XPath的Java版本如何工作,但在.NET中,XPath会编译一个动态程序集,然后将其添加到应用程序域中。随后使用该表达式时,会查看现在加载到内存中的程序集。
在某些情况下,我使用XPath导致了一种情况,我认为这种机制类似于慢慢填满内存的内存泄漏。
我的理论是,由于每个表达式都是使用用户的值编译的,因此每个编译的表达式都是唯一的,因此新的表达式被编译并添加到应用程序域中。
由于可以从应用程序域中删除程序集而无需重新启动整个应用程序域,因此每次评估表达式时都会消耗内存,并且无法恢复。结果,代码以内存中的程序集形式泄漏内存,过一段时间后,您知道结果。