0 votes

Erreur DEADLOCK_WRAP lors de l'utilisation de Berkeley Db en python (bsddb)

J'utilise une base de données berkdb pour stocker une énorme liste de paires clé-valeur mais pour une raison quelconque, lorsque j'essaie d'accéder à certaines des données plus tard, j'obtiens 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 qu'est DeadlockWrap mais il n'y a aucun autre programme ou processus qui accède à la base de données berkdb ou qui y écrit (pour autant que je sache), donc je ne sais pas comment nous pourrions obtenir un blocage, si cela fait référence à cela. Est-il possible que j'essaie d'accéder rapidement aux données ? 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 l'exécute avec plusieurs ensembles de données et cette erreur ne se produit qu'avec l'un d'entre eux, le plus grand, mais pas avec les autres.

4voto

paxdiablo Points 341644

Je suis presque certain que le DeadlockWrap n'est pas pertinent ici. C'est simplement un moyen de fournir automatiquement des tentatives avec une stratégie d'arrêt. . En d'autres termes, si la manipulation de la base de données échoue, elle attend un peu puis essaie à nouveau, un certain nombre de fois avant d'échouer finalement.

Vous semblez obtenir un KeyError de votre dictionnaire get qui est plus probablement due au 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 la table (en affichant la valeur Urk! ). Quant à ce que vous faites dans ce cas, cela dépend de votre architecture. Vous voudrez probablement retourner soit None ou une chaîne vide. Vous pouvez également vouloir faire exactement ce que vous faites maintenant (lever une exception).

0voto

mrcuongnv Points 25
contenttext = contentdict[key] if contentdict.has_key(key) else None

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X