我有一个包含许多子元素的大型xml文件。我希望能够运行一些xpath查询。我尝试在java中使用vtd-xml,但有时会出现outofmemory错误,因为xml非常大以适应内存。是否有另一种处理如此大的xml的方法。
答案 0 :(得分:2)
SAXParser非常有效
答案 1 :(得分:2)
你现在想做什么?通过它的声音,您尝试使用基于DOM的解析器,它实质上将整个XML文件作为DOM表示加载到内存中。如果您正在处理大型文件,最好使用SAX解析器,它以流式方式处理XML文档。
我个人推荐StAX。
答案 2 :(得分:2)
尝试http://code.google.com/p/jlibs/wiki/XMLDog
它使用sax执行xpath,而不创建xml文档的内存表示。
答案 3 :(得分:0)
您使用的是标准vtd还是扩展的VTD-xml?如果你使用扩展XML,那么你可以选择使用内存映射......你试过吗?
答案 4 :(得分:0)
如果计划在长期存在的应用程序中动态编译许多表达式,那么使用XPath可能不是一个好主意。
我不完全确定java版本的XPath是如何工作的,但在.NET XPath中编译动态程序集然后将其添加到app域。对表达式的后续使用会查看现在加载到内存中的程序集 在一个案例中,我使用XPath导致了一种情况,我认为,这种相同类型的机制正在减慢填充内存,类似于内存泄漏。
我的理论是,由于每个表达式都是使用用户的值编译的,因此每个编译的表达式可能都是唯一的,因此编译了一个新表达式并将其添加到应用程序域中。 由于您可以从应用程序域中删除程序集而不重新启动整个应用程序域,因此每次计算表达式时都会消耗内存并且无法恢复。结果,代码在内存中以程序集的形式泄漏内存,过了一段时间,你就知道了结果。