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

0 投票
2 回答
1294 浏览
提问于 2025-04-15 21:10

我正在使用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或者一个空字符串。你也可以选择继续现在的做法(抛出异常)。

撰写回答