随机访问大型XML文件

时间:2011-05-05 12:45:08

标签: xml indexing xml-parsing random-access

我有一组索引大型XML文件(MediaWiki转储文件)的工具,并使用这些权限随机访问存储在文件中的各个记录。它工作得非常好,但我正在使用字符串函数和/或正则表达式“解析”XML,而不是真正的XML解析器,如果创建文件的方式将来会改变,这是一个脆弱的解决方案。

某些或大多数XML解析器是否有办法执行此类操作?

(我的工具版本用C,Perl和Python编写。将整个文件解析为某种数据库或将它们映射到内存中都不是选项。)

更新

以下是用于比较的粗略统计数据:我使用的文件大多每周发布一次,当前文件的大小为1,918,212,991字节。我的索引工具的C版本在我的上网本上花了几分钟,只需要为每个发布的新XML文件运行一次。我不太经常在另一个XML文件上使用相同的工具,该文件的当前大小为30,565,654,976字节,并且在2010年仅更新了8次。

5 个答案:

答案 0 :(得分:1)

我认为您应该将这些数据存储在XML数据库(例如exists-DB)中,而不是创建自己的工具来执行XML数据库为您提供的一小部分。

答案 1 :(得分:1)

如果您正在使用Python,请尝试使用lxml - 它的非常快速而灵活,并且它与正则表达式的速度相当。用任何语言比替代品快得多 - 毫不妥协。

使用iterparse逐步浏览维基百科文章。

请注意,这不会让您随意访问转储中的文章(这是一个非常合理的请求!) - 但iterparse会为您提供一个快速且易于使用的“仅向前”游标...和lxml可能是用来通过其他方式解析fseek的块的正确工具。

这是我找到的最好的文档:

http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/index.html

(试试pdf版)

它现在是标准python发行版的一部分。

答案 2 :(得分:1)

VTD-XML看起来是解决这个问题的第一次认真尝试:

  

世界上内存效率最高(1.3倍~1.5倍大小的XML文档) 随机访问XML解析器 。< / p>

(VTD-XML甚至在StackOverflow上有自己的标签,所以你可以关注它的任务等等:

答案 3 :(得分:0)

XML是一种结构化格式。因为随机访问并没有多大意义 - 你必须知道你要去哪里。

正则表达式还需要将整个字符串加载到内存中。这仍然优于DOM,因为DOM通常占用的内存比XML文件大3-4倍。

这些案例的典型解决方案是SAX,其中有一个非常小内存占用但它们就像一个只向前游标:因此你不是随机访问的,你有遍历树,到达你需要的地方。如果您使用的是.NET,则可以使用XmlTextReader

如果XML不经常更新,索引也很有用,因为创建这样的索引可能很昂贵。

答案 4 :(得分:-1)

XPath远比字符串/正则表达式“解析”好,但xpath首先将xml文档解析为内存DOM,如果文档非常大,则可能会出现内存问题。