使用Pickle在Datastore上存储复杂对象,任何更快的替代方案?

时间:2010-08-10 08:05:24

标签: google-app-engine pickle

要将复杂对象存储到数据存储区,我目前正在使用此方法:

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 个答案:

答案 0 :(得分:3)

文档说model_to_protobuf需要Model个实例,如果您的对象已经是Model,您也可以直接指向该对象的ReferenceProperty 。我建议你首先使用相当实际的数据对酸洗进行基准测试,以确切地找出 慢速酸洗/去除的方法。它可能不是慢,但实际上知道在提交工作密集型修复之前,过早优化是邪恶的以及所有这些(你可能知道......)可能是好事。

但如果它实际上很慢,我建议你尝试对需要以较低能力格式进行序列化的对象进行建模(因此可能更快),例如JSON(这是实用的,因为你已经在app引擎中有JSON个功能(将其导入为django.utils.simplejson)。

如果可以将对象序列化为Model个实例,我建议你这样做。如果在运行时之前不知道所有属性,那么总是有Expando个模型。