Хранение сложного объекта в хранилище данных с помощью Pickle, есть ли более быстрые альтернативы? - PullRequest
0 голосов
/ 10 августа 2010

Чтобы сохранить сложный объект в хранилище данных, я сейчас использую этот подход:

class PickleProperty(db.Property): 
  data_type = db.Blob
  def get_value_for_datastore(self, model_instance):
    value = self.__get__(model_instance, model_instance.__class__)
    if value is not None:
      return db.Blob(pickle.dumps(value))
  def make_value_from_datastore(self, value):
    if value is not None:
      return pickle.loads(str(value))

class ComplexModel(db.Model):
      data = PickleProperty()

Как вы знаете, Google App Engine не имеет более эффективного модуля cPickle; это приводит к очень медленной работе.

Есть ли лучшая стратегия?

1 Ответ

3 голосов
/ 10 августа 2010

Документы говорят, что model_to_protobuf хочет экземпляр Model, и, если ваш объект уже является Model, вы также можете сделать ReferenceProperty, указывающий непосредственно на этот объект.Я бы порекомендовал вам первый сравнительный анализ с прилично реалистичными данными, чтобы точно узнать, каково медленное травление / расслоение.Это может быть не слишком медленно, но, возможно, было бы хорошо знать, что перед принятием исправлений, требующих интенсивной работы, преждевременная оптимизация - это зло и все такое (как вы, вероятно, знаете ...).

Но если это действительно медленно, я бы посоветовал вам попытаться смоделировать объекты, которые нуждаются в сериализации, в менее способном формате (и, следовательно, возможно, быстрее), например JSON (что было бы практично, поскольку у вас уже есть JSON присутствуют возможности в движке приложения (импортируйте его как django.utils.simplejson).

Если возможно сериализовать объекты как Model экземпляры, я предлагаю вам сделать это. Если вы не знаете все атрибуты до времени выполнения,всегда есть Expando моделей.

...