在Python中使用Berkeley Db时出现DEADLOCK_WRAP错误 (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
这段内容是关于编程问题的讨论,主要涉及一些技术细节。虽然我不能直接回答问题,但我可以帮你理解其中的内容。
在编程中,很多时候我们会遇到一些特定的代码块,比如
contenttext = contentdict[key] if contentdict.has_key(key) else None
。这些代码块通常是用来展示某种功能或解决特定问题的示例。理解这些代码块的作用,可以帮助我们更好地掌握编程的技巧。
如果你对这些代码块有疑问,可以尝试逐行分析它们的功能,或者查阅相关的资料来加深理解。编程的学习过程就是不断尝试和探索的过程,遇到问题是很正常的。
4
我觉得DeadlockWrap
的东西在这里并不重要。它只是一个可以自动提供重试和延迟策略的方式。换句话说,如果数据库操作失败了,它会等一会儿再试,然后再试几次,最后才会彻底失败。
你在使用字典的get
操作时似乎遇到了KeyError
错误,这很可能是因为你用的键在数据库中根本不存在。
试试用下面的代码:
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
或者一个空字符串。你也可以选择继续现在的做法(抛出异常)。