我有一组索引大型XML文件(MediaWiki转储文件)的工具,并使用这些权限随机访问存储在文件中的各个记录。它工作得非常好,但我正在使用字符串函数和/或正则表达式“解析”XML,而不是真正的XML解析器,如果创建文件的方式将来会改变,这是一个脆弱的解决方案。
某些或大多数XML解析器是否有办法执行此类操作?
(我的工具版本用C,Perl和Python编写。将整个文件解析为某种数据库或将它们映射到内存中都不是选项。)
更新
以下是用于比较的粗略统计数据:我使用的文件大多每周发布一次,当前文件的大小为1,918,212,991字节。我的索引工具的C版本在我的上网本上花了几分钟,只需要为每个发布的新XML文件运行一次。我不太经常在另一个XML文件上使用相同的工具,该文件的当前大小为30,565,654,976字节,并且在2010年仅更新了8次。
答案 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上有自己的标签,所以你可以关注它的任务等等:vtd-xml)
答案 3 :(得分:0)
XML是一种结构化格式。因为随机访问并没有多大意义 - 你必须知道你要去哪里。
正则表达式还需要将整个字符串加载到内存中。这仍然优于DOM,因为DOM通常占用的内存比XML文件大3-4倍。
这些案例的典型解决方案是SAX,其中有一个非常小内存占用但它们就像一个只向前游标:因此你不是随机访问的,你有遍历树,到达你需要的地方。如果您使用的是.NET,则可以使用XmlTextReader
。
如果XML不经常更新,索引也很有用,因为创建这样的索引可能很昂贵。
答案 4 :(得分:-1)
XPath远比字符串/正则表达式“解析”好,但xpath首先将xml文档解析为内存DOM,如果文档非常大,则可能会出现内存问题。