Pregunta

Actualmente, tengo un diccionario que tiene un número como clave y una Clase como valor.Puedo acceder a los atributos de esa Clase así:

dictionary[str(instantiated_class_id_number)].attribute1

Debido a problemas de memoria, quiero usar el shelve módulo.Me pregunto si hacerlo es plausible.¿Un diccionario de estantería actúa exactamente igual que un diccionario estándar?Si no, ¿en qué se diferencia?

¿Fue útil?

Solución

Shelve no actúa extactly el mismo que el diccionario, sobre todo cuando se modifican los objetos que ya están en el diccionario.

La diferencia es que cuando se agrega una clase a un diccionario se almacena una referencia, pero conserva una estantería en escabeche (serializado) copia del objeto. Si a continuación, modifica el objeto que se modificar la copia en memoria, pero no la versión en escabeche. Que se pueden manejar (en su mayoría) de forma transparente por shelf.sync() y shelf.close(), el cual escribir entradas. Hacer todo ese trabajo no requiere el seguimiento de todos los objetos recuperados que no han sido escritas vuelto todavía por lo que tiene que shelf.sync llamada () para borrar la caché.

El problema con shelf.sync() borrar la memoria caché es que se puede mantener una referencia al objeto y modificarlo de nuevo.

Este código no funciona como se esperaba con un estante, pero trabajará con un diccionario:

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

Sinc vacía el caché de modo que el objeto 'p' modificada se pierde de la memoria caché por lo que no se escribe de nuevo.

Otros consejos

Sí, lo es plausible:

Los objetos de estantería admiten todos los métodos admitidos por los diccionarios.Esto facilita la transición de scripts basados ​​en diccionarios a aquellos que requieren almacenamiento persistente.

necesitas llamar shelf.sync() de vez en cuando para borrar el caché.

EDITAR

Cuidado, no es exactamente un dict.Véase, por ejemplo.La respuesta de Laurión.

Ah, y sólo puedes tener str llaves.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top