Каков наиболее эффективный способ хранения списка кортежей в App Engine?

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

Когда я столкнулся с этой проблемой, кортежи могут быть любыми: от пар значений ключа, до данных datetime и sample, до (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()

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

Способ 3:

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

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

Способ 4:

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

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

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

Спасибо, Джим

Ответ 1

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

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

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