Frage

Zur Zeit habe ich ein Wörterbuch, das eine Nummer als Schlüssel und eine Klasse als Wert hat. Ich kann die Attribute dieser Klasse zugreifen wie folgt:

dictionary[str(instantiated_class_id_number)].attribute1

Durch Speicherprobleme, möchte ich das shelve Modul verwenden. Ich frage mich, wenn dies plausibel ist. Hat ein shelve Wörterbuch genau das gleiche wie ein Standard-Wörterbuch handeln? Wenn nicht, wie funktioniert es unterscheiden?

War es hilfreich?

Lösung

Shelve wirkt nicht extactly das gleiche wie Wörterbuch, vor allem, wenn Objekte ändern, die bereits im Wörterbuch sind.

Der Unterschied besteht darin, dass, wenn Sie eine Klasse zu einem Wörterbuch hinzufügen eine Referenz gespeichert ist, aber shelve hält eine gebeizt (serialisiert) des Objekts kopieren. Wenn Sie dann das Objekt ändern werden Sie ändern Sie die im Speicher befindlichen Kopie, aber nicht die eingelegte Version. Das kann durch shelf.sync() und shelf.close() transparent behandelt (meistens) werden, die schreiben Einträge. Macht die ganze Arbeit erfordert alle abgerufenen Objekte Tracking, die geschrieben wurden nicht noch zurück, so dass Sie Anruf shelf.sync haben Sie (), um den Cache zu löschen.

Das Problem mit shelf.sync() dem Löschen des Cache ist, dass Sie einen Verweis auf das Objekt halten und ändern Sie es erneut.

Dieser Code funktioniert nicht wie mit einem Regal erwartet, wird aber mit einem Wörterbuch arbeiten:

s["foo"] = MyClass()
s["foo"].X = 8 
p = s["foo"] # store a reference to the object
p.X = 9 # update the reference
s.sync() # flushes the cache
p.X = 0
print "value in memory: %d" % p.X # prints 0
print "value in shelf: %d" % s["foo"].X # prints 9

Sync leert den Cache so das modifizierte ‚p‘ Objekt aus dem Cache verloren ist, damit es nicht wieder geschrieben wird.

Andere Tipps

Ja, es ist plausibel :

  

Shelf-Objekte unterstützen alle Methoden, die von Wörterbücher unterstützt. Dies erleichtert den Übergang von Wörterbuch basiert Skripte zu denen erfordern persistenten Speicher.

Sie müssen jeder so oft shelf.sync() anrufen, um den Cache zu löschen.

EDIT

Achten Sie darauf, es ist nicht gerade ein dict. Siehe z.B. Laurion Antwort.

Oh, und man kann nur str Schlüssel hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top