Повышение производительности App Engine за счет уменьшения размера объекта - PullRequest
7 голосов
/ 10 октября 2009

Цель состоит в том, чтобы уменьшить стоимость процессора и время отклика для фрагмента кода, который выполняется очень часто и каждый раз должен выполнять db.get () несколько сотен ключей.

Это вообще работает?

Могу ли я ожидать время API db.get () с несколькими сотнями ключей уменьшить примерно линейно, как я уменьшить размер объекта? В настоящее время организация имеет следующие данные: 9 Строка, 9 Boolean, 8 целых, 1 GeoPt, 2 DateTime, 1 текст (средний размер ~ 100 байт FWIW), 1 ссылка, 1 StringList (средний размер 500 байт). Цель состоит в том, чтобы переместить подавляющее большинство этих данных в связанные классы, чтобы основной выбор основной модели будет быстрым.

Если это работает, как это реализовано?

После рефакторинга я все равно понесу высокая стоимость получения существующих объектов? В документации сказано что все свойства модели выбираются одновременно. Будет старый ненужные свойства по-прежнему переносятся через RPC на мои десять центов и пока пользователи Подождите? Другими словами: , если я хочу сократить время загрузки моих объектов, необходимо перенести старые сущности на новые определение? Если это так, достаточно ли переставить () объект или я должен сохранить под совершенно новым ключом?

Пример

Рассмотрим:

class Thing(db.Model):
    text    = db.TextProperty()
    strings = db.StringListProperty()
    num     = db.IntegerProperty()

thing = Thing(key_name='thing1', text='x' * 10240,
      strings = ['y'*500 for i in range(10)], num=23)
thing.put()

Допустим, я переопределил Thing для упрощения и запустил новую версию:

class Thing(db.Model):
    num = db.IntegerProperty()

И я снова получаю:

thing_again = Thing.get_by_key_name('thing1')

Уменьшил ли я время выборки для этой сущности?

Ответы [ 3 ]

12 голосов
/ 10 октября 2009

Чтобы ответить на ваши вопросы по порядку:

  • Да, разделение вашей модели уменьшит время выборки, хотя, вероятно, не линейно. Для такой маленькой модели, как ваша, различия могут быть не очень большими. Свойства большого списка являются основной причиной увеличения времени выборки.
  • Старые свойства будут по-прежнему передаваться при извлечении объекта после изменения модели, поскольку хранилище данных не знает моделей.
  • Кроме того, однако, удаленные свойства будут сохраняться даже после вызова .put (). В настоящее время есть два способа устранить старые свойства: заменить все существующие сущности новыми или использовать интерфейс api.datastore более низкого уровня, который похож на dict и упрощает удаление ключей.
1 голос
/ 07 января 2010

Чтобы удалить свойства из сущности, вы можете изменить вашу модель на Expando, а затем использовать delattr . Это документировано в документации App Engine здесь:

http://code.google.com/intl/fr/appengine/articles/update_schema.html

Под заголовком " Удаление удаленных свойств из хранилища данных "

0 голосов
/ 10 октября 2009

если я хочу уменьшить размер моего лица, необходимо ли мигрировать старые сущности с теми, с новыми определение?

Да. Хранилище данных GAE - это просто большое хранилище значений ключей, которое ничего не знает об определениях вашей модели. Таким образом, старые значения будут старыми, пока вы не введете новые значения!

...