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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top