我在上个月遇到了一个基本的数据存储查询问题。它涉及2个db.Models,其中一个使用db.ReferenceProperty引用另一个。数据存储性能,我的代码或数据存储延迟
问题是,根据管理日志的请求大约需要2-4秒才能完成。我将它分解为一个裸露的表单和一个列表来显示结果。 投入运行良好,但积累(在我看来)多CPU时间的方式。
#The get look like this:
outputData['items'] = {}
labelsData = Label.all()
for label in labelsData:
labelItem = label.item.name
if labelItem not in outputData['items']:
outputData['items'][labelItem] = { 'item' : labelItem, 'labels' : [] }
outputData['items'][labelItem]['labels'].append(label.text)
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, outputData))
#And the models:
class Item(db.Model):
name = db.StringProperty()
class Label(db.Model):
text = db.StringProperty()
lang = db.StringProperty()
item = db.ReferenceProperty(Item)
我试图让它成为许多不同的方式,即。而不是ReferenceProperty将Item模型中的所有Label键作为db.ListProperty存储。
我的测试数据只是Item中的10行和Label中的40。
所以我的问题:这是一个傻瓜差事来尝试优化这一点,因为高CPU使用率是由于数据存储的问题,或者我只是在代码中的某处搞砸了? ..fredrik
编辑:
我从djidjadji在谷歌的AppEngine邮件列表了很大的反响。
新的代码如下所示:
我已经使用了Appstats。它是ReferenceProperty,它为每个循环制定和查询问题。但是我在googleappengine邮件列表上获得了很多帮助。我不知道如何在不引用ReferenceProperty的情况下做出相同的结果。解决方案是在for循环之前使用get_value_for_datastore。 – fredrik 2010-06-08 13:11:37
你仍然得到了迭代查询的问题。调用.fetch()而不是迭代查询会更有效率。此外,请参阅此博客文章,了解解决参考属性的配方:http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine – 2010-06-08 15:09:18