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

Я собираю базовый фотоальбом на 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 ответа

Решение

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

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

придирки: тебе не нужны the_photos = None

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

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

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

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

Другие вопросы по тегам