2011-05-05 53 views
4

我有一组的哪个索引大型XML文件(链接到MediaWiki转储文件),并使用这些的indeces对随机存取存储在文件中的单个记录工具。它工作得很好,但我用字符串函数和/或正则表达式“解析”XML,而不是真正的XML解析器,这是一个脆弱的解决方案,应该在将来改变文件的创建方式。大的XML文件随机存取

做一些或大多数XML解析器有办法做这样的事情?

(我有我的C语言编写的,Perl和Python工具版本。解析整个文件转换成某种数据库或将它们映射到内存中没有选项)。

UPDATE

这里是粗略的统计比较:我使用的文件大多每周发布一次,目前的文件大小为1,918,212,991字节。我的索引工具的C版本在我的上网本上花费了几分钟,并且只需为每个发布的新XML文件运行一次。不经常我使用其当前大小为30565654976个字节,并于2010

回答

1

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

世界上最节省内存(1.3倍〜1.5倍的XML文档的大小)随机存取XML解析器

(VTD-XML即使在这里,在计算器上拥有自己的标签,所以你可以按照它等questins:

+1

我想知道为什么在一年之内没有人评论过这个答案。这个用例非常罕见吗?这对你来说有效吗@hippietrail? – fho 2014-02-27 11:33:28

+0

@弗洛里安:我从来没有尝试过。当时我正在使用的编程语言中没有实现/库/胶水,维基百科XML转储文件的格式仍然没有改变,无法与我以前的简单化方法一起使用。但我同意你的看法,在这里似乎没有人提到这样的用例... – hippietrail 2014-02-27 12:48:01

+0

也许这只是选择正确的工具的正确工具的问题。 XML在随机访问*和*大文件的同时并不是很好。 Otoh如果我只有一大堆XML,如果我被要求在这些文件中提供随机访问,我没有多少选择。购买更多内存和使用DOM被考虑,但最终我们在多台计算机上创建了大型文件,购买更多内存只是延迟了这个问题。 – fho 2014-02-27 13:18:25

0

XML进行了更新只有8次是结构化的格式另一个XML文件相同的工具。因此随机存取没有真正太大的意义 - 你必须知道你要去哪里。

正则表达式也需要被加载到存储器中的整个字符串。这比DOM更好,因为DOM通常比XML文件的大小多3-4倍的内存。

对于这些情况的典型解决方案是SAX当这些有一个非常小内存足迹,但他们就像一个只进游标:因此你不是随机访问,你必须遍历树来得到你需要。如果您使用.NET,则可以使用XmlTextReader

指数也很有用,如果XML不因为创建这些指数可以是昂贵的经常更新。

+1

如果真的就没有太大的意义,比为什么会W3放这么多努力定义XML的二进制表示的随机访问?参见(除其他外)http://www.w3.org/TR/xbc-properties/#random-access; – Abel 2012-03-10 14:17:23

-1

XPath是远远大于串/正则表达式“解析”更好,但XPath的工作原理与XML文档被解析到内存中的DOM首先,如果您的文件是真正的大,你可能会得到内存问题。

1

我想你应该存储这些数据以XML数据库如存在-DB,而不是创建自己的工具做什么XML数据库给你一个非常小的子集。

+0

你能给一些理由吗?我不需要做的事情超过一小部分。我将阅读这个存在的数据库,但它会如何比较速度?显然这至少意味着所需的存储空间翻一番。 – hippietrail 2011-05-05 14:29:53

1

如果你正在使用Python,尝试LXML - 这是非常快速和灵活,并且它会比较不错用正则表达式的速度。用任何语言比替代品快得多 - 毫不妥协。

使用iterparse步骤通过维基百科的文章。

请注意,这不会给你的转储文章的随机访问(这是一个完全合理的请求!) - 但iterparse会给你一个快速和易于使用的'只进'游标...和lxml可能是通过其他方式解析块fseek'd的正确工具。

下面是我为它找到了最好的文档:

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

(试行PDF版本)

它现在的标准Python发行的一部分。

+0

如果正则表达式在某些时候中断了,而不是为了指出实际的随机访问,那么Hmm可能对创建索引很有用。 – hippietrail 2011-08-16 09:18:03