Question

À l'heure actuelle, j'ai un dictionnaire qui a un numéro comme la clé et une classe en tant que valeur. Je peux accéder aux attributs de cette classe comme ceci:

dictionary[str(instantiated_class_id_number)].attribute1

En raison de problèmes de mémoire, je veux utiliser le module shelve. Je me demande si cela est plausible. Est-ce qu'un dictionnaire shelve agit exactement le même comme un dictionnaire standard? Dans le cas contraire, comment fonctionne-t-il différent?

Était-ce utile?

La solution

Shelve n'agit pas extactly le même que le dictionnaire, notamment lors de la modification des objets qui sont déjà dans le dictionnaire.

La différence est que lorsque vous ajoutez une classe à un dictionnaire de référence est stockée, mais conserve une étagère décapé (sérialisé) copie de l'objet. Si vous modifiez alors l'objet que vous voulez modifier la copie en mémoire, mais pas la version marinée. Cela peut être manipulé (la plupart du temps) de manière transparente par shelf.sync() et shelf.close(), qui écrivent des entrées. Faire tout ce travail ne nécessite le suivi de tous les objets récupérés qui ne sont pas écrites encore de retour de sorte que vous ne devez appeler shelf.sync () pour effacer le cache.

Le problème avec shelf.sync() vider le cache est que vous pouvez conserver une référence à l'objet et le modifier à nouveau.

Ce code ne fonctionne pas comme prévu avec une étagère, mais fonctionnera avec un dictionnaire:

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 vide le cache donc l'objet « p » modifiée est perdue à partir du cache de sorte qu'il ne soit pas réécrites.

Autres conseils

Oui, il est plausible:

  

objets prennent en charge toutes les méthodes Shelf pris en charge par les dictionnaires. Cela facilite la transition de scripts à base de dictionnaire à ceux nécessitant un stockage persistant.

Vous devez appeler shelf.sync() tous si souvent pour effacer le cache.

EDIT

Faites attention, ce n'est pas exactement un dict. Voir par exemple La réponse de Laurion.

Oh, et vous ne pouvez avoir des clés de str.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top