2010-07-15 6 views
1

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

Спасибо за ваши собеседники.

Edit 01:

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

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

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

+4

Если синтаксический анализ XML доминирует над вашим заданием или поставит вас на ограничение в 30 секунд, вы должны пересмотреть структуру своей задачи. Трудно ответить на этот вопрос, так как это действительно «Каков наиболее эффективный парсер для конкретного ввода?» где вход не определен. – msw

+1

Пожалуйста, опубликуйте результаты того, что вы в конечном итоге используете, поэтому следующий человек может извлечь выгоду из ваших исследований. Кроме того, уверены ли вы, что этап обработки XML этой задачи действительно будет узким местом этих задач? –

ответ

1

Я знаю, что это не меняет вопрос непосредственно, но 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 (тайм-аут). Затем я увеличил срок до 10 секунд и начал получать по 5 каналов за раз.

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

Смежные вопросы