更快/更Django-ish查询使用一些非常慢的XPath的大型XML文件的方法

时间:2012-03-07 21:29:25

标签: xml django xpath elementtree

django中views.py文件中的一个函数具有以下代码:

from lxml import etree
f = etree.parse("path/to/file/k2.xml")
for item in charList:
    first += f.xpath(u"//character[item='"+item+"']/path/to/entry[@type='on']/text()")
    second += f.xpath(u"//character[item='"+item+"']/path/to/entry[@type='off']/text()")

这会加载一个14mb的XML文件,扫描直到找到正确的项目,并使用XPath将两个值添加到两个变量中。

这真的很慢 - 5到6秒,这对于高流量站点来说是不可接受的。

Django告诉你没有为每个查询进行数据库调用,而是在settings.py文件中有一个永久连接 - 但如果你使用的是SQL,而不是XML。

是否有某种方法可以加快速度,也许总是将xml文件放在内存中?

1 个答案:

答案 0 :(得分:1)

跨14MB XML文件执行XPath会很慢,特别是如果您使用//作为查询的根目录。这将强制处理器找到每个节点并检查Xpath的有效性。

如果可以,请将文件分解为较小的文档 - 请记住XML是基于文档的格式,您的所有内容是否需要在一个文件中?

如果您必须使用这么大的文件,那么尝试获取最完整的XPath。如果您知道内容仅位于根ndoe的某个分支中,请指定该内容。即使是Xpath根部的微小变化也会对速度产生很大影响。