25 июл. 2011 г.

Google App Engine как быстрее хранить данные

Стал задумываться – как быстрее всего получать доступ к данным в пределах одного объекта при условии, что полей относительно много и поиск по ним не нужен, т.е. необходимости хранить каждое поле отдельно – нет.

К тому же в GAE в каждом объекте сохраняется название каждого поля + оно же хранится в каждом индексе, если индекс не отключается принудительно, т.е. в объем случае места может быть занято раз в 10 больше, чем сохраненно собственно данных.

Рассматриваемые варианты: поле объекта, десериализованный словарь. Для сериализации словаря есть два простых варианта – встроенный – Pickle и json. Тест выполнен следующим образом: каждая операция выполняется пока не будет получено исключение DeadlineExceededError, как только оно получено – выводится количество произведенных итераций и запрос завершается.  Каждый тест выполняется 4 раза. Первый тест идет для объего обзора и в усреднении не участвует, т.к. в этот момент запускается инстанс, собирается байт-код и т.п. Все запросы выполнялись по очереди, чтобы гарантировано обрабатываться на том же инстансе что и предыдущие
Получение свойства из объекта: 11581454, 15897754, 16719559, 15739328. Среднее: 16 118 880
Получение свойств из словаря: 117059883, 123362268, 171216019, 118629746. Среднее: 137 736 011
Сохранение в Json: 13637, 15078, 13947, 20607. Среднее: 49 632
Сохранение в Pickle: 70444, 60782, 71197, 70122. Среднее: 67 367
Загрузка в Json: 23493, 22166, 23793, 24599. Среднее: 23 519
Загрузка в Pickle: 122675, 123934, 122640, 112645. Среднее: 119 739

Общий вывод: для большого количества обращений к полям объекта лучше использовать словарь, к тому же это более гибкая структура, чем поле объекта. Для сериализации – Pickle. Пожалуй единственный минус pickle – результат получается человеко-нечитаемым, но в данном случае оно и не требуется.

Комментариев нет:

Отправить комментарий