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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top