Ошибка 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