【发布时间】:2010-07-22 05:18:48
【问题描述】:
上个月,我在一个非常基本的数据存储查询方面遇到了一些问题。它涉及 2 个 db.Model,其中一个通过 db.ReferenceProperty 引用另一个。
问题是根据管理员日志,请求大约需要 2-4 秒才能完成。我将其剥离为一个简单的表格和一个列表以显示结果。 put 工作正常,但 get 会累积(在我看来)很多 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 将项目模型中的所有标签键存储为 db.ListProperty。
我的测试数据在 Item 中只有 10 行,在 Label 中只有 40 行。
所以我的问题是:尝试优化它是愚蠢的差事,因为高 cpu 使用率是由于数据存储的问题还是我只是在代码中的某个地方搞砸了? ..弗雷德里克
编辑:
我在 google appengine 邮件列表中收到了 djidjadji 的好评。
新代码如下所示:
outputData['items'] = {}
labelsData = Label.all().fetch(1000)
labelItems = db.get([Label.item.get_value_for_datastore(label) for label in labelsData ])
for label,labelItem in zip(labelsData, labelItems):
name = labelItem.name
try:
outputData['items'][name]['labels'].append(label.text)
except KeyError:
outputData['items'][name] = { 'item' : name, 'labels' : [label.text] }
【问题讨论】:
标签: python google-app-engine optimization google-cloud-datastore