Использование небольших операций с хранилищем данных в appengine - PullRequest
2 голосов
/ 15 февраля 2012

Я собираю базовый фотоальбом на appengine, используя python 27. Я написал следующий метод для извлечения деталей изображения из хранилища данных, соответствующих определенному «приключению». Я использую ограничения и смещения для нумерации страниц, однако это очень неэффективно. После просмотра 5 страниц (из 5 фотографий на страницу) я уже использовал 16% своего Datastore Small Operations. Интересно, что я использовал только 1% операций чтения из хранилища данных. Как я могу сделать это более эффективным для небольших операций хранилища данных - я не уверен, из чего они состоят.

def grab_images(adventure, the_offset=0, the_limit = 10):
    logging.info("grab_images")
    the_photos = None
    the_photos = PhotosModel.all().filter("adventure =", adventure)
    total_number_of_photos = the_photos.count()
    all_photos = the_photos.fetch(limit = the_limit, offset = the_offset)
    total_number_of_pages = total_number_of_photos / the_limit
    all_photo_keys = []
    for photo in all_photos:
        all_photo_keys.append(str(photo.blob_key.key()))
    return all_photo_keys, total_number_of_photos, total_number_of_pages

Ответы [ 3 ]

6 голосов
/ 15 февраля 2012

Несколько вещей:

  1. Вам не нужно каждый раз вызывать счетчик, вы можете его кэшировать
  2. То же самое относится и к запросу, почему вы запрашиваете всевремя?кешируйте также.
  3. кешируйте также страницы, вам не нужно каждый раз вычислять данные на странице.
  4. Вам нужен только blob_key, но вы загружаете всю фотографию, попробуйте смоделировать еетаким образом, что вам не нужно загружать все атрибуты Photo.

придирки: вам не нужны the_photos = None

1 голос
/ 15 февраля 2012

Способ обработки подкачки неэффективен, так как он проходит каждую запись перед смещением для доставки данных.Вам следует подумать о создании механизмов разбиения на страницы, используя методы закладок, описанные Google http://code.google.com/appengine/articles/paging.html.

. Используя этот метод, вы просматриваете только те элементы, которые вам нужны для каждой страницы.Я также призываю вас кешировать должным образом, как предлагает Шэй, это и быстрее, и дешевле.

0 голосов
/ 16 февраля 2012

Возможно, вы захотите перейти на новый NDB API.Его использование фьючерсов, кэшей и автоматических пакетов может вам очень помочь.Явное лучше, чем неявное, но управление деталями в NDB делает ваш код проще и более читабельным.

Кстати, вы пытались использовать appstats и посмотреть, как ваши запросы используют ресурсы сервера?

...