Быстрее / больше Django-иш способ запроса большого XML-файла, который использует очень медленный XPath - PullRequest
2 голосов
/ 08 марта 2012

Одна из функций в моем файле views.py в django имеет следующий код:

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-файл 14 МБ, просматривает, пока не находит нужный элемент и добавляет два значения к двумпеременные с использованием XPath.

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

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

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

1 Ответ

1 голос
/ 16 мая 2013

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

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

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

...