Ошибка DEADLOCK_WRAP при использовании Berkeley Db в python (bsddb)

Я использую berkdb для хранения огромного списка пар ключ-значение, но по какой-то причине, когда я пытаюсь получить доступ к некоторым данным позже, я получаю эту ошибку:

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

Я не уверен, что такое DeadlockWrap, но нет какой-либо другой программы или процесса, обращающегося к berkdb или пишущего в него (насколько я знаю), поэтому не уверен, как мы можем получить тупик, если он ссылается на это. Возможно ли, что я пытаюсь быстро получить доступ к данным? У меня есть этот вызов функции в цикле, так что-то вроде

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

Я запускаю это с несколькими наборами данных, и эта ошибка возникает только с одним из них, самым большим, но не с остальными.

2 ответа

Решение

Я уверен, что DeadlockWrap материал здесь не актуален. Это просто способ автоматически обеспечить повторы с помощью стратегии отсрочки. Другими словами, если манипулирование базой данных завершается неудачно, она немного ждет, а затем повторяет попытку несколько раз, прежде чем, наконец, потерпит неудачу.

Вы, кажется, получаете KeyError из вашего словаря get операция, которая, скорее всего, связана с тем, что используемый вами ключ фактически не существует в базе данных.

Попробуйте свой код с чем-то вроде:

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

Это должно показать вам, если запись не существует в таблице (путем вывода Urk! сообщение). То, что вы делаете в этом случае, зависит от вашей архитектуры. Вы, вероятно, хотели бы вернуть либо None или пустая строка. Вы также можете делать именно то, что делаете сейчас (возбуждая исключение).

contenttext = contentdict[key] if contentdict.has_key(key) else None
Другие вопросы по тегам