Question

J'utilise un berkdb pour stocker une liste énorme de paires clé-valeur, mais pour une raison quelconque lorsque je tente d'accéder à certaines des données plus tard, je reçois cette erreur:

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

Je ne suis pas sûr de ce que DeadlockWrap est, mais il ny a pas tout autre programme ou processus accédant au berkdb ou en écrivant à (comme autant que je sache,) donc je ne sais comment nous pourrions obtenir une impasse, si sa référence à cela. Est-il possible que je suis en train d'accéder aux données à rapidement? J'ai cet appel de fonction dans une boucle, donc quelque chose comme

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

Je suis en cours d'exécution avec ce plusieurs ensembles de données et cette erreur se produit uniquement avec l'un d'eux, le plus grand, pas les autres.

Était-ce utile?

La solution

Je suis certain que la substance de DeadlockWrap n'est pas pertinente. Il est tout simplement un moyen de fournir automagiquement avec une stratégie retries de back-off . En d'autres termes, si la manipulation de base de données échoue, il attend un peu essaie là encore, un certain nombre de fois avant de finalement échouer.

Vous semblez obtenir un KeyError de votre opération de get dictionnaire qui est plus probable en raison du fait que la clé que vous utilisez n'existe pas réellement dans la base de données.

Essayez votre code avec quelque chose comme:

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

Cela devrait vous montrer si l'enregistrement n'existe pas dans le tableau (en sortant le message Urk!). Quant à ce que vous faites dans ce cas, cela dépend de votre architecture. Vous auriez probablement eu envie de revenir soit None ou une chaîne vide. Vous pouvez également faire exactement ce que vous faites maintenant (soulever une exception).

Autres conseils

contenttext = contentdict[key] if contentdict.has_key(key) else None
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top