【问题标题】:Indexing a large XML file索引大型 XML 文件
【发布时间】:2018-08-02 01:42:10
【问题描述】:

给定一个大型 (74GB) XML 文件,我需要通过给定的字母数字 ID 读取特定的 XML 节点。从上到下读取文件以查找 ID 需要很长时间。

XML 文件的索引是否类似于关系数据库的索引?我想象一个小的索引文件,其中字母数字 ID 可以快速找到,并指向较大文件中的位置。

是否存在 XML 的索引文件?如何在 C# 中实现它们?

【问题讨论】:

  • “给定一个大 (74GB) XML 文件” - 在开发过程或评估过程中,没有人会想:“等等,这不是文件会有点大,XML 真的是正确的存储格式吗?”?您确定索引会解决问题吗?您不想将内容实际读入 RDBMS 吗?
  • ^^ CodeCaster 所说的 + 或者没有 一个 巨大的 XML 文件但有许多更小的 XML 文件不是更合理吗?当他们告诉我“我们有一个 74GB 的 XML 文件”时,我(作为高级开发人员)会告诉初级开发人员的第一件事是“你疯了吗?让我和提出这个的人谈谈……”跨度>
  • @CodeCaster - 是的,将 XML 文件读入数据库,并在数据库中索引列是一种选择。我很好奇是否有替代方案。
  • @Fildor - 这是另一种选择。当前正在运行批处理以将文件拆分为 1000 万个较小的 XML 文件。它已经连续运行了 48 小时 :)
  • 一千万……哇。另一个重新考虑 XML 的理由。这是来自第 3 方系统的某种 DB 转储吗?

标签: c# xml performance indexing bigdata


【解决方案1】:

BaseX、eXistDB 或 MarkLogic 等 XML 数据库可以满足您的需求:它们将 XML 文档加载到磁盘上的持久形式中,并允许使用索引快速访问文档的某些部分。

一些 XML 数据库针对处理许多小型文档进行了优化,而另一些则能够处理少量大型文档,因此请谨慎选择您的产品(我无法就此提供建议),并考虑将文档分解为更小的文档加载时的零件。

如果您需要将大文档拆分为许多小文档,请考虑使用流式 XSLT 3.0 处理器,例如 Saxon-EE。我预计处理 75Gb 大约需要一个小时:显然取决于您机器的速度。

【讨论】:

    【解决方案2】:

    不,这超出了 XML 试图实现的范围。如果 XML 不经常更改并且您从中读取很多内容,我建议每次更改时将其内容重写到本地 SQLite DB 中,然后改为从数据库中读取。在进行重写时,请记住 SAX 样式的 XML 读取是您处理此类大型文件的好帮手。

    理论上,您可以通过记住已发现 ID 的位置来创建某种索引,然后自行解析,但这会非常脆弱。 XML 不够简单,您无法自行解析它,希望您能符合标准。

    当然,我想在这里你不能对更大的设计本身做任何事情:正如其他人所说,该文件的大小表明存在架构问题。

    【讨论】:

      猜你喜欢
      • 2015-08-28
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2011-05-09
      相关资源
      最近更新 更多