Domanda

Al momento, ho un dizionario che ha un numero come la chiave e una classe come un valore. Posso accedere agli attributi di quella classe in questo modo:

dictionary[str(instantiated_class_id_number)].attribute1

A causa di problemi di memoria, voglio usare il modulo shelve. Mi chiedo se ciò è plausibile. Fa un ripiano dizionario agire esattamente lo stesso come un dizionario standard? Se no, in che cosa differisce?

È stato utile?

Soluzione

Shelve non agisce extactly lo stesso dizionario, in particolare quando si modificano oggetti già nel dizionario.

La differenza è che quando si aggiunge una classe a un dizionario è memorizzato un riferimento, ma mantiene un ripiano in salamoia (serializzato) copia dell'oggetto. Se quindi si modifica l'oggetto si vuole modificare la copia in memoria, ma non la versione in salamoia. Che può essere gestito (per lo più) in modo trasparente dal shelf.sync() e shelf.close(), che scrivere le voci. Fare tutto questo lavoro non richiede il monitoraggio di tutti gli oggetti recuperati che non sono stati scritti indietro eppure così si ha a chiamata shelf.sync () per cancellare la cache.

Il problema con shelf.sync() svuotare la cache è che si può mantenere un riferimento all'oggetto e modificarlo di nuovo.

Questo codice non funziona come previsto con una mensola, ma funziona con un dizionario:

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 svuota la cache in modo da l'oggetto modificato 'p' è perso dalla cache in modo che non viene ripristinato.

Altri suggerimenti

Si, è plausibile :

  

Shelf oggetti di supporto tutti i metodi supportati da dizionari. Questo facilita la transizione dal dizionario di base di script per quelli che richiedono la memorizzazione permanente.

È necessario chiamare shelf.sync() ogni tanto per cancellare la cache.

Modifica

Fare attenzione, non è esattamente un dict. Vedi per esempio La risposta di Laurion.

Oh, e si può avere solo le chiavi str.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top