我将一些RSS feed放入app Engine的数据存储中,以便为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会更好?
发布于 2010-04-02 06:45:56
通过例如superfeedr的外包提要解析
你也可以研究一下superfeedr.com。他们有一个合理的免费配额/付费计划。他们将为您/等做轮询(在15分钟内您将获得更新)。如果提要也支持pubsubhubbub,那么您将实时接收提要!如果你还不知道,这段视频将向你解释什么是pubsubhubbub。
由Brett Slatkin编写的改进的提要解析器
我还建议你看看Brett Slatkin解释pubsubhubbub的这个很棒的video。我还记得,在演示文稿中的某个地方,他说他不使用Universal Feedparser
,因为它只是为他的问题做了很多工作。他编写了自己的SAX解析器(在视频演示中他稍微谈到了这一点),解析器的速度非常快。我想你应该看看pubsubhubbub code,看看他是如何做到这一点的。
发布于 2010-04-02 05:09:39
我会试试ElementTree或Universal Feed Parser,看看他们是不是更好。从Python2.5开始,ElementTree就在stdlib中,所以它可以在App Engine上使用。
发布于 2010-04-02 22:19:47
如果你的网站访问量很低,你可能会遇到你的应用的启动时间。如果应用程序空闲了几分钟,应用程序引擎就会减速以节省资源。当下一个请求到来时,应用程序必须在处理请求之前启动,这都会添加到您的cpu配额中。如果你搜索appengine新闻组,你会发现它充满了对此的抱怨。
我将superfeedr用于我的站点www.newsfacet.com,我注意到当superfeedr通知我时,我可以在几百毫秒内处理几篇rss文章。如果距离最后一次输入已经有一段时间了,那么这一次可以跳到10秒或11秒,因为它会产生旋转成本。
https://stackoverflow.com/questions/2563568
复制相似问题