В течение последнего месяца у меня была небольшая проблема с довольно простым запросом хранилища данных. Он включает 2 модели db.Medel, одна из которых ссылается на другую с помощью db.ReferenceProperty.
Проблема заключается в том, что, согласно журналам администратора, запрос занимает около 2-4 секунд. Я раздели его до чистого листа и списка для отображения результатов.
Путь работает нормально, но get накапливает (на мой взгляд) много времени.
#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, сохраняющего все ключи Label в модели элементов в виде db.ListProperty.
Мои тестовые данные - всего 10 строк в Item и 40 в Label.
Итак, мои вопросы: глупо ли пытаться оптимизировать этот процесс, поскольку высокая загрузка ЦП вызвана проблемами с хранилищем данных, или я просто что-то испортил в коде?
..фредрик
EDIT:
Я получил отличный ответ от djidjadji в списке рассылки google appengine.
Новый код выглядит так:
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] }