2012-03-07 1 views
2

Одна из функций в моем файле views.py в Джанго имеет следующий код:Faster/More Джанго-иш способ запроса большого файла XML, который, используя некоторые действительно медленный XPath

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()") 

Это загружает XML 14Mb файл, сканирует до тех пор, пока не найдет правильный элемент и добавит два значения к двум переменным, используя XPath.

Это очень медленно - от 5 до 6 секунд, что неприемлемо для сайта с высоким трафиком.

Django учит вас, что у вас нет запроса на базу данных для каждого запроса, но вместо этого есть постоянное соединение в файле settings.py, но это если вы используете SQL, а не XML.

Есть ли способ ускорить это, возможно, всегда имея xml-файл в памяти?

+0

Я перенес файл XML в базу данных MySQL, которая намного быстрее. Но этот вопрос все еще стоит: / – LittleBobbyTables

ответ

1

Выполнение XPath через XML-файл размером 14 МБ будет медленным, особенно если вы используете // в качестве корня запроса. Это заставит обработчик найти каждый узел и проверить правильность пути Xpath.

Если вы можете, разбейте файл на более мелкие документы - помните, что XML - это формат на основе документа, все ли ваше содержимое нужно быть в одном файле?

Если вам нужно использовать такой большой файл, попробуйте и получите самый полный XPath. Если вы знаете, что контент находится только в одной из ветвей корневого ndoe, укажите это. Даже небольшое изменение в корне Xpath может иметь большое влияние на скорость.