Использование меньших операций с хранилищем данных в 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 и посмотреть, как ваши запросы используют ресурсы сервера?