代码之家  ›  专栏  ›  技术社区  ›  systempuntoout

用pickle将复杂对象存储在数据存储上,有更快的选择吗?

  •  0
  • systempuntoout  · 技术社区  · 14 年前

    要将复杂对象存储到数据存储,我当前使用的方法是:

    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()
    

    如你所知,谷歌应用引擎没有更有效的CPickle模块;这会导致操作非常缓慢。

    有更好的策略吗?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Jacob Oscarson    14 年前

    医生说 model_to_protobuf 想要一个 Model 如果对象已经是 模型 你也可以做一个 ReferenceProperty 直接指向那个对象。我建议你先用相当实际的数据来做腌制基准,以准确地找出 怎样 缓慢的酸洗/脱粘。它可能不是 很慢,但在进行工作密集型修复之前,最好知道过早的优化是有害的(正如您可能知道的那样)。

    但是,如果实际速度很慢,我建议您尝试以一种不太好的格式(因此可能更快)对需要序列化的对象建模,例如 JSON (这是很实际的,因为你已经 杰森 应用程序引擎中的功能存在(导入为 django.utils.simplejson )

    如果可以将对象序列化为 模型 我建议你这样做。如果直到运行时才知道所有属性,那么 Expando 模型。