Ошибка DEADLOCK_WRAP при использовании Berkeley Db в python (bsddb) - PullRequest
0 голосов
/ 03 апреля 2010

Я использую 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 ]

4 голосов
/ 25 августа 2010

Я почти уверен, что материал 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, либо пустую строку. Вы также можете делать именно то, что делаете сейчас (возбуждая исключение).

0 голосов
/ 27 августа 2010
contenttext = contentdict[key] if contentdict.has_key(key) else None
...