Производительность хранилища данных, мой код или задержка хранилища данных - PullRequest
0 голосов
/ 08 июня 2010

В течение последнего месяца у меня была небольшая проблема с довольно простым запросом хранилища данных. Он включает 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] }

Ответы [ 2 ]

3 голосов
/ 08 июня 2010

Конечно, вы можете сделать что-то для оптимизации своего кода. Например, вы перебираете запрос, который менее эффективен, чем выборка запроса и перебор результатов.

Я бы порекомендовал использовать Appstats для профилирования вашего приложения и проверить серию сообщений Patterns of Doom .

0 голосов
/ 08 июня 2010

Не просто пробуй вещи. Это угадывание. Вы будете правы только в какое-то время . По этой же причине не просите других угадывать.

Будь прав каждый раз.

Просто приостановите код несколько раз и посмотрите на стек вызовов. Это скажет вам точно что происходит.

...