0

我正在使用 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

我正在使用多个数据集运行此错误,并且此错误仅发生在其中一个,最大的一个,而不是其他数据集上。

4

2 回答 2

4

我很确定这些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或一个空字符串。您可能还想完全按照您现在正在做的事情(引发异常)。

于 2010-08-25T05:18:29.550 回答
0
contenttext = contentdict[key] if contentdict.has_key(key) else None
于 2010-08-27T18:07:31.057 回答