2010-07-07 16 views
12

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

的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库/方法可以用来最好地处理这个问题?

+0

_你需要做什么类型的查询?查询是按批次还是按要求?您可以提供哪些场景的其他特征? – 2010-07-07 17:06:13

+0

+1用于编辑以清楚地解释问题 – 2010-07-08 15:49:22

回答

1

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

+1

这看起来很有前途。我研究这一点,如果它适合我​​的需要,我可以将问题标记为已回答。 – Jan 2010-07-07 22:56:20

0

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

+0

Piccolo的最后一个版本是从2004年开始的,并有几年前的开放bug报告,因此我不推荐使用它。 – 2010-07-07 22:05:33

4

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

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

更好地描述你想要完成的事情可能有助于获得更好的答案。

+0

+1为更好的描述更好的答案... – 2010-07-07 17:33:14