Какой синтаксический анализ XML наиболее эффективен для GAE (версия Python)? - PullRequest
1 голос
/ 15 июля 2010

Я думаю, что все мы знаем эту страницу , но предоставленные критерии датированы более двух лет назад. Итак, я хотел бы знать, не могли бы вы указать лучший XML-парсер вокруг. Поскольку мне нужен только парсер xml, для меня важнее всего скорость над всем остальным. Моя цель - обработать некоторые XML-каналы (около 25 КБ) размером 4 КБ (это будет ежедневная задача). Как вы, наверное, знаете, я ограничен тайм-аутом запроса в 30 секунд. Итак, какой самый лучший парсер (только Python), который я могу использовать?

Спасибо за ваши ответы.

Редактировать 01:

@ Питер Рекор Больной. Я сейчас пишу код и планирую запустить профилирование в ближайшем будущем. Что касается вашего вопроса, ответ - нет. Обработка занимает совсем немного времени по сравнению с загрузкой фактического XML-канала. Но я не могу увеличить пропускную способность Google, поэтому сейчас могу сосредоточиться только на этом.

Моя единственная проблема в том, что мне нужно сделать это как можно быстрее, потому что моя цель - получить снимок статуса сайта. И, поскольку интернет работает, и люди продолжают добавлять и изменять его данные, мне нужен самый быстрый метод, потому что любая вставка данных в течение промежутка времени «загрузки и обработки» фактически испортит мой статистический анализ.

Раньше я делал это со своего компьютера, и тогда процесс занимал 24 минуты, но теперь на сайте больше информации в 12 раз.

1 Ответ

1 голос
/ 17 июля 2010

Я знаю, что это не удивляет мой вопрос напрямую, но id делает то, что мне просто нужно.

Я вспомнил, что xml - не единственный тип файла, который я мог бы использовать, поэтому вместо использования анализатора xml я решил использовать json. Примерно в 2,5 раза меньше по размеру. Что означает уменьшение времени загрузки. Я использовал simplejson в качестве json libray.

Я использовал from google.appengine.api import urlfetch, чтобы параллельно получать потоки json:

class GetEntityJSON(webapp.RequestHandler):
  def post(self):
    url = 'http://url.that.generates.the.feeds/'
    if self.request.get('idList'):
      idList = self.request.get('idList').split(',')

      try:
        asyncRequests = self._asyncFetch([url + id + '.json' for id in idList])
      except urlfetch.DownloadError:
        # Dealed with time out errors (#5) as these were very frequent

      for result in asyncRequests:
        if result.status_code == 200:
          entityJSON = simplejson.loads(result.content)
          # Filled a database entity with some json info. It goes like this:
          # entity= Entity(
          # name = entityJSON['name'],
          # dateOfBirth = entityJSON['date_of_birth']
          # ).put()

    self.redirect('/')

  def _asyncFetch(self, urlList):
    rpcs = []
    for url in urlList:
      rpc = urlfetch.create_rpc(deadline = 10)
      urlfetch.make_fetch_call(rpc, url)
      rpcs.append(rpc)
    return [rpc.get_result() for rpc in rpcs]

Я пытался получать 10 каналов одновременно, но в большинстве случаев отдельный канал вызывал ошибку DownloadError # 5 (Time out). Затем я увеличил срок до 10 секунд и начал получать 5 каналов одновременно.

Но, тем не менее, 25k фидов, получая 5 за раз, приводит к 5k звонкам. В очереди, которая может порождать 5 задач в секунду, общее время задачи должно составлять 17 минут.

...