Java 逐记录比较两个非常大的XML文件的最佳方法

Java 逐记录比较两个非常大的XML文件的最佳方法,java,xml,vtd-xml,Java,Xml,Vtd Xml,我有两个大的XML文件(3GB,80000条记录)。一个是另一个的更新版本。我想确定哪些记录已更改(已添加/更新/删除)。文件中有一些时间戳,但我不确定它们是否可信。与文件中记录的顺序相同 这些文件太大,无法以XML的形式加载到内存中(即使是一个,更不用说两个) 我当时的想法是,在记录级别上使用内存中的ID映射对第一个文件中的内容偏移量进行某种解析/索引,然后对第二个文件进行流式处理,并使用随机访问来比较这两个文件中存在的记录。这可能需要2到3次传球,但没关系。但我找不到简单的库/方法可以让我这

我有两个大的XML文件(3GB,80000条记录)。一个是另一个的更新版本。我想确定哪些记录已更改(已添加/更新/删除)。文件中有一些时间戳,但我不确定它们是否可信。与文件中记录的顺序相同

这些文件太大,无法以XML的形式加载到内存中(即使是一个,更不用说两个)

我当时的想法是,在记录级别上使用内存中的ID映射对第一个文件中的内容偏移量进行某种解析/索引,然后对第二个文件进行流式处理,并使用随机访问来比较这两个文件中存在的记录。这可能需要2到3次传球,但没关系。但我找不到简单的库/方法可以让我这么做。带有VTDNAV的vtd xml看起来很有趣,但我无法理解(从文档中)它是否支持基于预先保存位置的随机访问、重新访问和加载记录


首选Java库/解决方案,但C也可以接受。

只需使用SAX或StAX同时解析两个文档,直到遇到差异,然后退出。它不会将文档保存在内存中。任何标准XML库都将支持S(t)AX。唯一的问题是,如果考虑元素的不同顺序是不重要的……

扩展VTD-XML支持内存映射,这意味着文档可能不完全加载在内存中。它支持随机访问,就像标准vtd xml一样。当您说无法在内存中加载文档时,我认为扩展vtd可能是正确的选择,应该比sax更易于使用和更快。当您谈到“文件太大,无法以XML形式加载到内存中”时,您使用了什么数据结构?如果您找不到任何可以在代码中分析文件的内容,还有一些其他的解决方案,比如开源项目@vtdxml作者,我确实看过扩展vtd,但我不知道如何重新访问记录。似乎有一些方法可以获取元素long[]或index的位置,但没有返回该位置的方法。有这样的例子吗?VTD记录可以从VTDNAVMARGE对象访问,它们本质上是一个大数组,可以通过指定索引值来寻址。每个记录都有偏移量、长度、类型和深度。如果您需要更多信息,请告诉我,因为此处空间有限…我不确定我是否可以保证内部订单,尽管这可能值得检查。谢谢你的建议。