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

4
我有两个大型XML文件(3GB,80000条记录)。其中一个是另一个的更新版本。我想确定哪些记录发生了变化(已添加/已更新/已删除)。文件中有一些时间戳,但我不确定它们是否可信。在文件内部,记录的顺序也是如此。
这些文件太大,无法作为XML加载到内存中(即使只有一个,更别说两个了)。
我的思路是,在内存中使用ID映射表对第一个文件中的记录级内容做某种解析/索引,并使用随机访问流来比较同时存在于两个文件中的那些记录。这可能需要2或3次通过才能完成,但这没关系。但我找不到易于使用的库或方法来实现这一点。具有VTDNavHuge的vtd-xml看起来很有趣,但我无法从文档中理解它是否支持基于预先保存的位置的随机访问重访和记录的加载。
Java库/解决方案优先考虑,但C#也可以接受。

1
Extended Vtd-xml支持内存映射,这意味着文档可能没有完全加载到内存中。它支持与标准vtd-xml一样的随机访问。当您说无法将文档加载到内存中时,我认为扩展vtd可能是正确的选择,并且应该比sax更容易使用和更快速。 - vtd-xml-author
当你谈论“文件太大,无法作为XML加载到内存中”时,你使用了哪些数据结构? - classicjonesynz
如果您在代码中找不到任何分析文件的工具,还有其他解决方案,例如notepad++ compare或开源项目winmerge - classicjonesynz
1
VTD 记录可以从 VTDNavHuge 对象中访问,它们本质上是一个大数组,您可以通过指定索引值来访问。每个记录都有一个偏移量、长度、类型和深度。如果由于空间有限需要更多信息,请告诉我... - vtd-xml-author
@constantlearner - 谢谢,但那只是针对单个文档的。我已经知道如何处理了。我使用XOM进行操作,代码可用。我的问题是比较文件,这是下一个层次的问题。 - Alexandre Rafalovitch
显示剩余3条评论
1个回答

1

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


我不确定我能保证内部顺序,但这可能值得检查。感谢您的建议。 - Alexandre Rafalovitch

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