在python中使用Berkeley Db时出现DEADLOCK_WRAP错误(bsddb)

时间:2010-04-02 21:11:34

标签: python berkeley-db 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 个答案:

答案 0 :(得分:4)

我很确定DeadlockWrap内容与此无关。这只是automagically provide retries with a back-off strategy的一种方式。换句话说,如果数据库操作失败,它会稍等一会再尝试,最后再次尝试失败。

您似乎从字典KeyError操作中获得get,这更可能是因为您使用的密钥实际上并不存在于数据库中。< / p>

尝试使用类似的代码:

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或空字符串。你可能也想完成你现在正在做的事情(提出例外)。

答案 1 :(得分:0)

contenttext = contentdict[key] if contentdict.has_key(key) else None