Java 处理大型xml文件

Java 处理大型xml文件,java,xml,out-of-memory,Java,Xml,Out Of Memory,我有一个包含许多子元素的大型xml文件。我希望能够运行一些xpath查询。我尝试在java中使用vtd xml,但有时会出现内存错误,因为xml太大,无法放入内存。有没有其他方法可以处理如此大的xml。在处理大文件时非常有效您现在想做什么?听上去,您正试图使用一个基于DOM的解析器,它实际上是将整个XML文件作为DOM表示加载到内存中。如果您要处理一个大文件,最好使用SAX解析器,它以流式方式处理XML文档 我个人推荐这个 试试看 它使用sax执行XPath,而不创建xml文档的内存表示。您使用

我有一个包含许多子元素的大型xml文件。我希望能够运行一些xpath查询。我尝试在java中使用vtd xml,但有时会出现内存错误,因为xml太大,无法放入内存。有没有其他方法可以处理如此大的xml。

在处理大文件时非常有效

您现在想做什么?听上去,您正试图使用一个基于DOM的解析器,它实际上是将整个XML文件作为DOM表示加载到内存中。如果您要处理一个大文件,最好使用SAX解析器,它以流式方式处理XML文档

我个人推荐这个

试试看


它使用sax执行XPath,而不创建xml文档的内存表示。

您使用的是标准vtd还是扩展vtd xml?如果您使用扩展XML,那么您可以选择使用内存映射。。。您试过了吗?

如果您计划在长期使用的应用程序中动态编译许多表达式,那么使用XPath可能不是一个好主意

我不完全确定XPath的java版本是如何工作的,但在.NET中,XPath编译一个动态程序集,然后将其添加到应用程序域中。表达式的后续使用将查看现在加载到内存中的程序集。
在一个例子中,当我使用XPath时,它会导致一种情况,我认为,这种相同类型的机制会减慢内存的填充速度,类似于内存泄漏

我的理论是,由于每个表达式都是使用来自用户的值编译的,所以每个编译的表达式可能都是唯一的,因此会编译一个新的表达式并添加到应用程序域中。

由于无需重新启动整个应用程序域即可从应用程序域中删除程序集,因此每次计算表达式时都会消耗内存,因此无法恢复。结果,代码以内存中程序集的形式泄漏内存,过了一段时间,您就知道结果了。

您不能将XPath与直接SAX流一起使用(除非为每个查询重新解析整个文件)。@Glenn Maynard-但OP肯定必须为每个查询(或一批查询)重新解析文件。DOM太大,无法放入内存。为什么Python标记会出现在这个问题上?您是否希望人们提供Python解决方案?在解析文档或尝试xpath查询时是否会出现内存不足的错误?如果是第二种情况,那么问题可能在于xpath查询。无论哪种方式,您是否尝试为JVM的堆增加-Xmx的值?请尝试扩展vtd xml并使用内存映射选项