Оптимизация парсинга RSS на Механизме Приложения для предотвращения высоких предупреждений ЦП

Я вытягиваю некоторые каналы RSS в хранилище данных в Механизме Приложения для обслуживания до приложения для iPhone. Я использую крон для планирования обновления RSS каждый x минуты. Каждая задача только анализирует один канал RSS (который имеет 15-20 объектов). Я часто получаю предупреждения о высоком использовании ЦП в панели инструментов Механизма Приложения, таким образом, я ищу способы оптимизировать мой код.

В настоящее время я использую minidom (так как это уже находится там на Механизме Приложения), но я подозреваю, что это не очень эффективно!

Вот код:

 dom = minidom.parseString(urlfetch.fetch(url).content)
    if dom:
        items = []
        for node in dom.getElementsByTagName('item'):
            item = RssItem(
                key_name = self.getText(node.getElementsByTagName('guid')[0].childNodes),
                title = self.getText(node.getElementsByTagName('title')[0].childNodes),
                description = self.getText(node.getElementsByTagName('description')[0].childNodes),
                modified = datetime.now(),
                link = self.getText(node.getElementsByTagName('link')[0].childNodes),
                categories = [self.getText(category.childNodes) for category in node.getElementsByTagName('category')]
            );
            items.append(item);
        db.put(items);

def getText(self, nodelist):
    rc = ''
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc = rc + node.data
    return rc

Нет большого продолжения, но сценарии часто занимают процессорное время 2-6 секунд, которое кажется немного чрезмерным для цикличного выполнения через 20ish объекты и читающий несколько атрибутов.

Что я могу сделать для создания этого быстрее? Есть ли что-нибудь особенно плохо в вышеупомянутом коде, или я должен измениться на другой способ проанализировать? Есть ли существуют какие-либо библиотеки (что работа над Механизмом Приложения), который был бы лучше, или я буду лучше анализировать RSS сам?

5
задан Danny Tuppeny 1 April 2010 в 20:48
поделиться

5 ответов

Аутсорсинг синтаксического анализа фида, например, с помощью superfeedr

. Вы также можете заглянуть на superfeedr.com . У них есть разумные бесплатные квоты / планы оплаты. Они проведут опрос (в течение 15 минут вы получите обновления) за вас и т. Д. Если каналы также поддерживают pubsubhubbub , то вы будете получать каналы в реальном времени! Это видео объяснит вам, что такое pubsubhubbub , если вы еще не знаете.

Усовершенствованный синтаксический анализатор каналов, написанный Бреттом Слаткиным

Я бы также посоветовал вам посмотреть это замечательное видео от Бретта Слаткина, объясняющее pubsubhubbub. Я также помню, что где-то в презентации он сказал, что не использует Universal Feedparser , потому что он просто делает много работы для его проблемы. Он написал свой собственный синтаксический анализатор SAX (14:10 в видео-презентации он немного говорит об этом), который работает молниеносно. Думаю, вам следует проверить код pubsubhubbub , чтобы узнать, как ему это удалось.

4
ответ дан 14 December 2019 в 08:46
поделиться

Вам, вероятно, следует запустить профилировщик, чтобы определить, где код крутится. Это может быть ожидание соединения, поскольку некоторые RSS-каналы работают РЕАЛЬНО медленно.

Кроме того, некоторые библиотеки RDF/RSS/ATOM встроены в регулятор, чтобы не выбивать из хоста всю информацию при получении нескольких каналов с одного сайта. Я написал несколько агрегаторов, и быть внимательным к серверу очень важно.

Universal Feed Parser является полнофункциональным, по крайней мере, из того, что я видел, просматривая документацию. Я не использовал его, потому что писал свои агрегаторы на Ruby и имел другие потребности, но я знал о нем и рассмотрел бы его для решения на основе Python.

0
ответ дан 14 December 2019 в 08:46
поделиться

Если у вас небольшой объем трафика, поступающего на ваш сайт, ваше приложение может быстро раскручиваться. Если приложение простаивает всего несколько минут, движок приложения замедлит ваше приложение для экономии ресурсов. Когда приходит следующий запрос, приложение должно быть запущено, прежде чем оно сможет обработать запрос, и все это будет добавлено к вашей квоте процессора. Если вы выполните поиск в группе новостей appengine, то увидите, что она полна жалоб по этому поводу.

Я использую superfeedr для своего сайта www.newsfacet.com и замечаю, что когда superfeedr уведомляет меня большую часть времени, я могу обработать несколько RSS-статей за несколько сотен миллисекунд. Если с момента последнего ввода прошло некоторое время, это время может увеличиться до 10 или 11 секунд, так как это требует дополнительных затрат.

1
ответ дан 14 December 2019 в 08:46
поделиться

Что касается использования PubSubHubbub, чтобы позволить кому-то другому делать работу за вас, вы можете найти мою запись в блоге об использовании hubbub в App Engine , чтобы быть полезным.

1
ответ дан 14 December 2019 в 08:46
поделиться

Я бы попробовал ElementTree или Universal Feed Parser и посмотрел, может они лучше. ElementTree находится в stdlib начиная с Python 2.5, поэтому он доступен на App Engine.

1
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: