代码之家  ›  专栏  ›  技术社区  ›  Danny Tuppeny

优化应用程序引擎上的rss解析以避免高cpu警告

  •  5
  • Danny Tuppeny  · 技术社区  · 15 年前

    我正在将一些rss提要放入一个应用程序内的数据存储引擎中,以服务于一个iphone应用程序。我使用cron来安排每x分钟更新一次rss。每个任务只解析一个rss提要(包含15-20个条目)。我经常在app engine仪表板中收到关于高cpu使用率的警告,因此我正在寻找优化代码的方法。

    目前,我使用minidom(因为它已经存在于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
    

    没有太多的事情发生,但是脚本通常需要2-6秒的CPU时间,这对于循环浏览20个项目和读取一些属性来说似乎有点过分。

    我能做些什么来加快速度?上面的代码有什么特别糟糕的地方吗,或者我应该换一种解析方式吗?有没有更好的库(在app engine上工作的库),或者我自己分析rss会更好?

    5 回复  |  直到 13 年前
        1
  •  4
  •   Alfred    15 年前

    通过例如superfeedr进行外包feed解析

    你也可以调查一下 superfeedr.com . 他们有合理的免费配额/付款计划。如果feeds还支持 pubsubhubbub ,则您将实时收到订阅源!这段视频会告诉你 pubsubhubbub 如果你还不知道的话。

    brett-slatkin编写的改进feed解析器

    我也建议你看这个很棒的 video 从布雷特·斯莱特金的解释中。我还记得在演讲的某个地方他说他不使用 Universal Feedparser 因为这对他的问题起了很大的作用。他编写了自己的sax(14:10在视频演示中,他谈到了一点)解析器,速度极快。我想你应该去公共厕所看看 code 找出他是怎么做到的。

        2
  •  1
  •   dunelmtech    15 年前

    如果你的网站流量很低,你的应用程序可能会出现启动时间。如果某个应用程序空闲了几分钟,应用程序引擎将关闭您的应用程序以节省资源。当下一个请求进入应用程序时,必须先启动应用程序,然后才能处理该请求,这一切都将添加到您的CPU配额中。如果你搜索appengine新闻组,你会发现它充满了对此的抱怨。

    我的网站使用了SuperFeedr www.newsfacet.com 我注意到当superfeeder通知我大多数时间,我可以在几百毫秒内处理一些rss文章。如果从上次输入到现在已经有一段时间了,那么这段时间可以跳到10秒或11秒,因为这会导致自旋上升成本。

        3
  •  1
  •   Nick Johnson    15 年前

    关于使用pubsubbub让别人为你做这项工作,你可以找到我的 blog post on using hubbub on App Engine 有用的。

        4
  •  1
  •   Community CDub    13 年前

    我会尝试 ElementTree Universal Feed Parser 看看他们有没有好转。从Python2.5开始,elementTree就在stdlib中,所以它可以在app engine上使用。

        5
  •  0
  •   the Tin Man    15 年前

    您可能应该运行一个探查器来确定代码的旋转方向。它可能正在等待连接,因为有些rss订阅速度非常慢。

    此外,一些rdf/rss/atom库内置了一个调控器,以防止在从同一站点检索多个提要时从主机中击败cr*p。我已经写了几个聚合器,对服务器的体贴是很重要的。

    通用feed解析器是全功能的,至少从我在文档中看到的情况来看是这样的。我之所以没有使用它,是因为我用ruby编写了聚合器,并且有不同的需求,但我意识到了这一点,并将其视为基于python的解决方案。