Acessando dicionários versus prateleiras de acesso
-
25-09-2019 - |
Pergunta
Atualmente, tenho um dicionário que possui um número como chave e uma classe como valor. Eu posso acessar os atributos dessa classe como assim:
dictionary[str(instantiated_class_id_number)].attribute1
Devido a problemas de memória, quero usar o shelve
módulo. Gostaria de saber se isso é plausível. Um dicionário de Shelve age exatamente o mesmo que um dicionário padrão? Caso contrário, como isso difere?
Solução
Shelve não age exageradamente o mesmo que o dicionário, principalmente ao modificar objetos que já estão no dicionário.
A diferença é que, quando você adiciona uma classe a um dicionário, uma referência é armazenada, mas a Shelve mantém uma cópia em conserva (serializada) do objeto. Se você modificar o objeto, modificará a cópia na memória, mas não a versão em conserva. Que pode ser tratado (principalmente) transparentemente por shelf.sync()
e shelf.close()
, que escrevem entradas. Fazer todo esse trabalho exige rastrear todos os objetos recuperados que ainda não foram escritos de volta para que você precise ligar para a prateleira.sync () para limpar o cache.
O problema com shelf.sync()
Limpar o cache é que você pode manter uma referência ao objeto e modificá -lo novamente.
Este código não funciona como esperado com uma prateleira, mas trabalhará com um dicionário:
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 libera o cache para que o objeto 'P' modificado seja perdido do cache, para que não seja gravado.
Outras dicas
É sim plausível:
Os objetos de prateleira suportam todos os métodos suportados por dicionários. Isso facilita a transição de scripts baseados em dicionário para aqueles que exigem armazenamento persistente.
Você precisa ligar shelf.sync()
de vez em quando limpar o cache.
EDITAR
Cuide -se, não é exatamente um dict
. Veja, por exemplo, a resposta de Laurion.
Ah, e você só pode ter str
chaves.