Domanda

Sto usando un berkdb per memorizzare un elenco enorme di coppie chiave-valore, ma per qualche ragione quando provo ad accedere ad alcuni dei dati in seguito ottengo questo errore:

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']

Non sono sicuro di quello che è DeadlockWrap, ma non v'è nessun altro programma o processo l'accesso alla berkdb o scrivere ad essa (per quanto ne so,) quindi non so come siamo riusciti a ottenere una situazione di stallo, se riferiva a questo. E 'possibile che sto cercando di accedere ai dati per rapidamente? Ho questa funzione di chiamata in un ciclo, in modo da qualcosa come

for i in hugelist:
    #try to get a value from the berkdb
    #do something with it

Sto facendo funzionare questo con più set di dati e questo errore si verifica solo con uno di loro, il più grande, non gli altri.

È stato utile?

Soluzione

Sono abbastanza certo la roba DeadlockWrap non è rilevante qui. E 'semplicemente un modo per automagically forniscono tentativi con un back-off strategia . In altre parole, se la manipolazione del database non riesce, attende un po 'poi ci riprova, un certo numero di volte prima infine fallire.

Ti sembra di essere sempre un KeyError dalla vostra operazione get dizionario che è più probabile che sia dovuto al fatto che la chiave che si sta utilizzando in realtà non esiste nel database.

Prova il codice con qualcosa di simile:

try:
    key = 'scrape011201-590652'
    if not contentdict.has_key(key):
        print "Urk!, No record for %s"%(key)
    contenttext = contentdict[key]
except:
    print the error

Questo dovrebbe mostrare se il record non esiste nella tabella (emettendo il messaggio Urk!). Quanto a ciò che si fa in questo caso, dipende dalla vostra architettura. Probabilmente si vorrebbe tornare sia None o una stringa vuota. Si consiglia inoltre di fare esattamente quello che stai facendo ora (sollevando un'eccezione).

Altri suggerimenti

contenttext = contentdict[key] if contentdict.has_key(key) else None
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top