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

3 Solutions collect form web for “Использование меньших операций с хранилищем данных в appengine”

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

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

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

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

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

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

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

  • Функция Python, не обращающаяся к переменной класса
  • UnicodeEncodeError: кодек ascii не может кодировать символы в позиции 0-3: порядковый номер не в диапазоне (128)
  • Поведение raw_input ()
  • спецификаторы требований: роль запятой
  • Почему «если нет (a и b)« быстрее, чем «если нет или нет b»?
  • subprocess.call не работает от pyCharm
  • Ajax succesfull call show div с данными формы
  • Python SocketServer: отправка нескольким клиентам?
  • Python: добавлять значения в список без цикла
  • Игра с нулевой суммой 16 бит версия
  • Как я могу напечатать только угаданную букву из слова в их соответствующих указаниях?
  • Python - лучший язык программирования в мире.