【问题标题】:Random queries on a large xml file对大型 xml 文件的随机查询
【发布时间】:2010-07-08 06:54:19
【问题描述】:

我有一个大的 xml 文件 (1Gb)。我需要对此 xml 文件进行许多查询(例如使用 xpath)。结果是 xml 的一小部分。 我希望查询尽可能快,但 1Gb 文件可能对于工作内存来说太大了。

xml 看起来像这样:

<all>
  <record>
      <id>1</id>
      ... lots of fields. (Very different fields per record including (sometimes) subrecords 
      so mapping on a relational database would be hard).
  </record>
  <record>
      <id>2</id>
      ... lots of fields.
  </record>
  .. lots and lots and lots of records
</all>

我需要随机访问,例如使用键来选择记录。 (Id 是最重要的,但其他字段也可以用作键)。我事先不知道查询,它们到达并且必须尽快执行,没有批量执行但实时。 SAX 看起来不太乐观,因为我不想为每个查询重新读取整个文件。但是 DOM 看起来也不是很有希望,因为文件非常大,并且增加额外的结构开销几乎肯定意味着它不适合工作内存。

我可以最好地使用哪个 java 库/方法来处理这个问题?

【问题讨论】:

  • 您需要进行什么样的查询?查询是分批的还是按要求进行的?您还可以提供场景的哪些其他特征?
  • +1 用于编辑以清楚地解释问题

标签: java xml


【解决方案1】:

在处理 XML 时,您通常有两种方法:流式传输 (SAX) 或将整个文档加载到内存中(各种 DOM 实现)。

如果您可以预先建立一组要批量处理的查询,您可以编写一个程序来使用 SAX 流式传输文件,查找匹配项。如果查询以随机间隔出现(即典型的数据库应用程序),那么您需要将整个文档加载到内存中,或者将 XML 文档预处理到某种数据库中。

更好地描述您要完成的工作可能有助于获得更好的答案。

【讨论】:

    【解决方案2】:

    vtd-xml 最适合您的用例。 http://vtd-xml.sourceforge.net/

    【讨论】:

    • 这看起来很有希望。我对此进行了调查,如果它适合我​​的需要,我可以将问题标记为已回答。
    【解决方案3】:

    Piccolo 是一个用于 Java 的小型、极快的 XML 解析器。它将SAX 1, SAX 2.0.1, and JAXP 1.1 (SAX parsing only) 接口实现为非验证解析器。它是 Apache 许可证上的 available

    【讨论】:

    • piccolo 的最后一个版本是从 2004 年开始的,并且有几年前的错误报告,所以我不建议使用它。
    【解决方案4】:

    取决于应用程序使用面向 xml 的数据库,例如 http://exist.sourceforge.net/ 可能会很有趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2011-03-30
      • 2016-07-13
      • 1970-01-01
      相关资源
      最近更新 更多