我正在将一些RSS源添加到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?
答案 0 :(得分:4)
您还可以查看superfeedr.com。他们有合理的免费配额/支付计划。他们将为您/等进行轮询(在15分钟内获得更新)。如果Feed还支持pubsubhubbub,那么您将实时收到Feed!如果您还不知道,此视频会向您解释pubsubhubbub是什么。
我还建议你观看Brett Slatkin解释pubsubhubbub的这个真棒video。我还记得在演示文稿的某个地方,他说他没有使用Universal Feedparser
,因为它只是为他的问题做了很多工作。他写了自己的SAX(14:10在视频演示中,他稍微谈了一下)解析器,这是快速闪电。我猜你应该看看pubsubhubbub code,看看他是如何做到这一点的。
答案 1 :(得分:1)
我会尝试ElementTree或Universal Feed Parser并查看它们是否更好。从Python 2.5开始,ElementTree在stdlib中,因此它可以在App Engine上使用。
答案 2 :(得分:1)
如果您的网站流量较低,则可能会遇到应用的启动时间。如果应用程序闲置几分钟,应用程序引擎将关闭您的应用程序以节省资源。当下一个请求进入时,必须先启动应用程序才能处理请求,这一切都会添加到您的cpu配额中。如果您搜索appengine新闻组,您会发现它充满了对此的抱怨。
我在我的网站www.newsfacet.com使用superfeedr,我注意到当superfeedr大部分时间通知我时,我可以在几百毫秒内处理一些rss文章。如果从最后一次输入开始已经有一段时间了,这次可以跳到10或11秒,因为它会产生旋转成本。
答案 3 :(得分:1)
关于使用PubSubHubbub让别人为你做的工作,你可能会发现我的blog post on using hubbub on App Engine很有用。
答案 4 :(得分:0)
你可能应该运行一个分析器来确定代码旋转轮子的位置。它可能正在等待连接,因为一些RSS源真的很慢。
此外,一些RDF / RSS / ATOM库构建在一个调控器中,以便在从同一站点检索多个源时避免将cr * p从主机中击出。我写了几个聚合器,并且对服务器的考虑很重要。
Universal Feed Parser功能齐全,至少从我通过浏览文档看到的内容来看。我没有使用它,因为我在Ruby中编写了我的聚合器并且有不同的需求,但我知道它并且会考虑将它用于基于Python的解决方案。