Kann ich ein python-Wörterbuch in google's BigTable-Datenspeicher speichern, ohne es explizit zu serialisieren?

Ich habe ein Python-Wörterbuch, das ich im Google-BigTable-Datenspeicher speichern möchte (es ist ein Attribut in einer db.Model Klasse).

Gibt es einen einfachen Weg, dies zu tun? db.DictionaryProperty mit einem db.DictionaryProperty ? Oder muss ich Pickle verwenden, um mein Wörterbuch zu serialisieren? Mein Wörterbuch ist relativ einfach. Es besteht aus Zeichenfolgen als Schlüssel, aber es kann auch Unterwörterbücher für einige Schlüssel enthalten. Beispielsweise:

 { 'myKey' : 100, 'another' : 'aha', 'a sub dictionary' : { 'a': 1, 'b':2 } } 

PS: Ich möchte serialisieren als Binär, nicht Text, wenn möglich.

3 Solutions collect form web for “Kann ich ein python-Wörterbuch in google's BigTable-Datenspeicher speichern, ohne es explizit zu serialisieren?”

Hier ist ein weiterer Ansatz :

 class DictProperty(db.Property): data_type = dict def get_value_for_datastore(self, model_instance): value = super(DictProperty, self).get_value_for_datastore(model_instance) return db.Blob(pickle.dumps(value)) def make_value_from_datastore(self, value): if value is None: return dict() return pickle.loads(value) def default_value(self): if self.default is None: return dict() else: return super(DictProperty, self).default_value().copy() def validate(self, value): if not isinstance(value, dict): raise db.BadValueError('Property %s needs to be convertible ' 'to a dict instance (%s) of class dict' % (self.name, value)) return super(DictProperty, self).validate(value) def empty(self, value): return value is None 

Ich denke, du kannst es nicht vermeiden, deine Objekte zu serialisieren.

Ich würde das folgende Modell definieren, um jeden Schlüssel, Wertpaar zu speichern:

 class DictModel(db.Model): value = db.TextProperty() 

Um in den Datenspeicher zu speichern, würde ich verwenden:

 def set_value(key, value): key = DictModel(value=pickle.dumps(value), key_name=key) key.save() return key 

Und um Daten abzurufen:

 def get_value(key): return pickle.loads(DictModel.get_by_key_name(key).value) 

Ich gehe davon aus, dass, wenn Sie in der Lage sein müssen, das Dict zu erreichen, es ist alles-zu-einmal? Du musst keine Werte aus dem Dict bekommen, solange es im Datenspeicher ist?

Wenn ja, müssen Sie serialisieren, aber müssen nicht Pickle verwenden; Wir verwenden stattdessen simplejson. Dann ist das Abrufen eine einfache Angelegenheit von overriding toBasicType (), so wie folgt:

Klasse MyModel (db.Model): #define einige Eigenschaften, einschließlich "data", die eine TextProperty ist, die eine biggish dict def toBasicType (self) enthält: return {'metadata': self.getMetadata (), 'data': simplejson.loads (Self.data)}

Die Erstellung beinhaltet das Aufrufen von MyModel (…, simplejson.dumps (data), …).

Wenn du schon Beizen hast, dann kann das deine beste Wette sein, aber einfach geht es gut für uns.

  • CPickle-Klasse mit Daten speichern in Datei
  • Mit cPickle, um ein großes Wörterbuch zu serialisieren, verursacht MemoryError
  • So entfernen Sie instancemethod Objekte, um der Gurke willen, ohne die ursprüngliche Klasse zu modifizieren
  • Klasse für Pickle- und Kopier-persistentes Objekt?
  • Was können Multiprocessing und Dill zusammen machen?
  • Python Distributed Computing (Werke)
  • Speichern eines 'lxml.etree._ElementTree' Objekts
  • Ein riesiges Bigram-Wörterbuch zu speichern, um mit Pickle zu filtern
  • Namespace auf Python Gurke
  • Warum Dill Dumps externe Klassen per Referenz, egal was?
  • Pickle Queue Objekte in Python
  • Python ist die beste Programmiersprache der Welt.