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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top