Error de WHUNTLOCK_WRAP cuando se usa Berkeley DB en Python (BSDDB)
-
24-09-2019 - |
Pregunta
Estoy usando un berkdb para almacenar una gran lista de pares de valor clave, pero por alguna razón, cuando intento acceder a algunos de los datos más adelante, obtengo este error:
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']
No estoy seguro de qué es DeadLockWrap, pero no hay ningún otro programa o proceso que acceda al BerkDB o escriba (hasta donde yo sé), por lo que no estoy seguro de cómo podríamos obtener un punto muerto, si se refiere a eso. ¿Es posible que esté tratando de acceder a los datos rápidamente? Tengo esta función de llamada en un bucle, así que algo así
for i in hugelist:
#try to get a value from the berkdb
#do something with it
Estoy ejecutando esto con múltiples conjuntos de datos y este error solo ocurre con uno de ellos, el más grande, no los otros.
Solución
Estoy bastante seguro del DeadlockWrap
Las cosas no son relevantes aquí. Es simplemente una forma de Proporcione reintentos automáticamente con una estrategia de retroceso. En otras palabras, si la manipulación de la base de datos falla, espera un poco y luego lo intenta nuevamente, varias veces antes de finalmente fallar.
Parece que estás recibiendo un KeyError
de tu diccionario get
Operación, que es más probable que se deba al hecho de que la clave que está utilizando en realidad no existe en la base de datos.
Pruebe su código con 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
Esto debería mostrarle si el registro no existe en la tabla (al emitir el Urk!
mensaje). En cuanto a lo que haces en ese caso, depende de tu arquitectura. Probablemente querrías regresar tampoco None
o una cadena vacía. También es posible que desee hacer exactamente lo que está haciendo ahora (planteando una excepción).
Otros consejos
contenttext = contentdict[key] if contentdict.has_key(key) else None