Erro de deadlock_wrap ao usar Berkeley DB em Python (BSDDB)
-
24-09-2019 - |
Pergunta
Estou usando um Berkdb para armazenar uma enorme lista de pares de valores-chave, mas por algum motivo, quando tento acessar alguns dos dados mais tarde, recebo este erro:
try:
key = 'scrape011201-590652'
contenttext = contentdict[key]
except:
print the error
<type 'exceptions.KeyError'> 'scrape011201-590652' in
contenttext = contentdict[key]\n', ' File "/usr/lib64/python2.5/bsddb/__init__.py",
line 223, in __getitem__\n return _DeadlockWrap(lambda: self.db[key]) #
self.db[key]\n', 'File "/usr/lib64/python2.5/bsddb/dbutils.py", line 62, in
DeadlockWrap\n return function(*_args, **_kwargs)\n', ' File
"/usr/lib64/python2.5/bsddb/__init__.py", line 223, in <lambda>\n return
_DeadlockWrap(lambda: self.db[key]) # self.db[key]\n']
Não tenho certeza do que é o deadlockwrap, mas não há outro programa ou processo acessando o Berkdb ou escrevendo para ele (até onde eu sei), então não tenho certeza de como poderíamos obter um impasse, se estiver se referindo a isso. É possível que eu esteja tentando acessar os dados rapidamente? Eu tenho essa chamada de função em um loop, então algo como
for i in hugelist:
#try to get a value from the berkdb
#do something with it
Estou executando isso com vários conjuntos de dados e esse erro ocorre apenas com um deles, o maior, não o outro.
Solução
Tenho certeza de que o DeadlockWrap
as coisas não são relevantes aqui. É simplesmente uma maneira de Forneça automaticamente tentativas com uma estratégia de retirada. Em outras palavras, se a manipulação do banco de dados falhar, ele aguarda um pouco e tentará novamente, várias vezes antes de finalmente falhar.
Você parece estar recebendo um KeyError
do seu dicionário get
A operação com maior probabilidade de ser devido ao fato de que a chave que você está usando não existe realmente no banco de dados.
Experimente seu código com algo como:
try:
key = 'scrape011201-590652'
if not contentdict.has_key(key):
print "Urk!, No record for %s"%(key)
contenttext = contentdict[key]
except:
print the error
Isso deve mostrar se o registro não existir na tabela (ao emitir o Urk!
mensagem). Quanto ao que você faz nesse caso, depende da sua arquitetura. Você provavelmente gostaria de retornar também None
ou uma corda vazia. Você também pode querer fazer exatamente o que está fazendo agora (levantando uma exceção).
Outras dicas
contenttext = contentdict[key] if contentdict.has_key(key) else None