【问题标题】:Best way to compare two very large XML files record by record逐条比较两个非常大的 XML 文件的最佳方法
【发布时间】:2013-04-11 01:30:46
【问题描述】:

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

文件太大而无法作为 XML 加载到内存中(即使是一个,也不要介意两个)。

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

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

【问题讨论】:

  • Extended Vtd-xml 支持内存映射,这意味着文档可能没有完全加载到内存中。它支持随机访问,就像标准的 vtd-xml 一样。当您说无法将文档加载到内存中时,我认为扩展 vtd 可能是正确的选择,并且应该比 sax 更易于使用且速度更快。
  • 当您谈到“文件太大而无法作为 XML 加载到内存中”时您使用了哪些数据结构?
  • 如果您在代码中找不到任何可以分析文件的内容,还有一些其他解决方案,例如notepad++ compare 或开源项目winmerge
  • @vtd-xml-author 我确实看过 Extended Vtd,但我不知道如何重新访问记录。似乎有方法可以将元素的位置作为 long[] 或索引,但没有方法可以返回到该位置。有没有这样的例子?
  • VTD 记录可以从 VTDNavHuge 对象访问,它们本质上是一个大数组,您可以通过指定索引值来寻址。每条记录都有一个偏移量、一个长度、一个类型和一个深度。由于空间有限,如果您需要更多信息,请告诉我...

标签: java xml vtd-xml


【解决方案1】:

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

【讨论】:

  • 我不确定我能否保证内部订单,尽管这可能值得检查。谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多