Оптимизация синтаксического анализа RSS в App Engine, чтобы избежать высоких предупреждений процессора - PullRequest
5 голосов
/ 02 апреля 2010

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

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

Вот код:

 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
1007

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

Ответы [ 5 ]

4 голосов
/ 02 апреля 2010

Аутсорсинг разбора фида через, например, superfeedr

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

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

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

1 голос
/ 03 апреля 2010

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

1 голос
/ 02 апреля 2010

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

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

1 голос
/ 02 апреля 2010

Я бы попробовал ElementTree или Универсальный анализатор подачи и посмотрю, лучше ли они.ElementTree находится в stdlib начиная с Python 2.5, поэтому он доступен в App Engine.

0 голосов
/ 02 апреля 2010

Вы, вероятно, должны запустить профилировщик, чтобы точно определить, где код вращается. Это может быть ожидание на соединениях, так как некоторые RSS-каналы очень медленные.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...