Использование меньших операций с хранилищем данных в appengine

Я собираю базовый фотоальбом на appengine с помощью python 27. Я написал следующий метод для извлечения данных изображения из хранилища данных, соответствующего конкретному "приключению". Я использую ограничения и смещения для разбивки на страницы, однако это очень неэффективно. После просмотра 5 страниц (из 5 фотографий на страницу) я уже использовал 16% своих небольших операций с хранилищем данных. Интересно, что я использовал только 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

Ответ 1

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

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

nitpicking: вам не нужны the_photos = None

Ответ 2

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

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

Ответ 3

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

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