Какой самый эффективный способ сохранить список кортежей в App-Engine? - PullRequest
10 голосов
/ 18 февраля 2011

При хранении и извлечении сущности хранилища данных, содержащей список кортежей, каков наиболее эффективный способ хранения этого списка?

Когда я сталкивался с этой проблемой, кортежи могут быть любыми: от пар ключ-значение до даты-времени и результатов выборки, до (x, y) координат.
Количество кортежей варьируется и варьируется от 1 до нескольких сотен.

На сущность, содержащую эти кортежи, нужно будет быстро / дешево ссылаться, а значения кортежей не нужно индексировать.

У меня была эта проблема несколько раз, и я решил ее разными способами.

Метод 1:

Преобразовать значения кортежа в строку и объединить их вместе с некоторым разделителем.

def PutEntity(entity, tuples):
  entity.tuples = ['_'.join(tuple) for tuple in tuples]
  entity.put()

Преимущества: Результаты легко читаются в Datastore Viewer, все загружается за один раз. Недостатки: Потенциальная потеря точности, программисту требуется десериализация / сериализация, требуется больше байтов для хранения данных в строковом формате.

Метод 2:

Сохраните каждое значение кортежа в списке и заархивируйте / разархивируйте кортеж.

def PutEntity(entity, tuples):
  entity.keys = [tuple[0] for tuple in tuples]
  entity.values = [tuple[1] for tuple in tuples]
  entity.put()

Преимущества: Нет потери точности, Смущает, но все еще можно просматривать данные в средстве просмотра Datastore, Возможность применять типы, Все выбирается за один раз.
Недостаток: программист должен заархивировать / разархивировать кортежи или тщательно поддерживать порядок в списках.

Метод 3:

Сериализует список кортежей в некоторых усадьбах json, pickle, протокольных буферов и сохраняет его в свойстве blob или text.

Преимущества: Используется с объектами и более сложными объектами, меньше риск пропуска ошибки при совпадении значений кортежа.
Недостатки: Требуется доступ к хранилищу BLOB-объектов и дополнительная выборка ?, Не удается просмотреть данные в средстве просмотра хранилища данных.

Метод 4:

Храните кортежи в другом объекте и храните список ключей.

Преимущества: Более очевидная архитектура. Если объект является представлением, нам больше не нужно хранить две копии данных кортежа.
Недостатки: Требуются две выборки: одна для списка сущностей и ключей и одна для кортежей.

Мне интересно, кто-нибудь знает, какой из них работает лучше всего, и есть ли способ, о котором я не думал?

Спасибо, Jim

1 Ответ

5 голосов
/ 18 февраля 2011

Я использую метод 3. Blobstore может потребоваться дополнительная выборка, но db.BlobProperty не требует.Для объектов, для которых важно, чтобы он выходил из хранилища именно так, как он был вставлен, я использую PickleProperty (который можно найти в tipfy и некоторых других служебных библиотеках).

Для объектов, где мне просто нужно его состояниеЯ написал функцию JsonProperty, которая работает аналогично PickleProperty (но, очевидно, использует SimpleJson).

Для меня получение всех данных за одну выборку и защита от идиота важнее производительности процессора (в приложенииEngine).Согласно разговору Google I / O о AppStats, поездка в хранилище данных почти всегда обходится дороже, чем локальный анализ.

...