对大型xml文件的随机查询

时间:2010-07-07 15:45:37

标签: java xml

我有一个大的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库/方法来处理这个问题?

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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