Frage

Ich verwende einen BerkDB, um eine große Liste von Schlüsselwertpaaren zu speichern, aber aus irgendeinem Grund, wenn ich versuche, später auf einige Daten zuzugreifen, erhalte ich diesen Fehler:

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

Ich bin mir nicht sicher, was Deadlockwrap ist, aber es gibt kein anderes Programm oder Prozess, der auf das Berkdb zugreifen oder darauf schreibt (soweit ich weiß), also nicht sicher, wie wir einen Deadlock bekommen könnten, wenn es sich darauf bezieht. Ist es möglich, dass ich versuche, schnell auf die Daten zugreifen zu können? Ich habe diesen Funktionsaufruf in einer Schleife, also so etwas wie

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

Ich betreibe dies mit mehreren Datensätzen und dieser Fehler tritt nur bei einem von ihnen auf, dem größten, nicht der anderen.

War es hilfreich?

Lösung

Ich bin mir ziemlich sicher, dass das DeadlockWrap Zeug ist hier nicht relevant. Es ist einfach ein Weg dazu Stellen Sie die Wiederholungen automatisch eine Back-Off-Strategie an. Mit anderen Worten, wenn die Datenbankmanipulation fehlschlägt, wartet sie ein wenig und versucht einige Male erneut, bevor sie schließlich versagt.

Sie scheinen eine zu bekommen KeyError Aus Ihrem Wörterbuch get Vorgänge, der eher auf die Tatsache zurückzuführen ist, dass der Schlüssel, den Sie verwenden, in der Datenbank nicht tatsächlich vorhanden ist.

Probieren Sie Ihren Code mit so etwas aus wie:

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

Dies sollte Ihnen zeigen, ob der Datensatz in der Tabelle nicht vorhanden ist (indem Sie die ausgeben Urk! Botschaft). Was Sie in diesem Fall tun, hängt dies von Ihrer Architektur ab. Sie würden wahrscheinlich auch zurückkehren wollen None oder eine leere Zeichenfolge. Vielleicht möchten Sie auch genau das tun, was Sie jetzt tun (eine Ausnahme).

Andere Tipps

contenttext = contentdict[key] if contentdict.has_key(key) else None
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top