2010-04-02 70 views
0

我正在使用berkdb存儲一個巨大的鍵值對列表,但由於某些原因,當我嘗試訪問某些數據後,發生此錯誤:DEADLOCK_WRAP在python中使用Berkeley DB時出錯(bsddb)

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

我很確定DeadlockWrap的東西在這裏不相關。這只是automagically provide retries with a back-off strategy的一種方式。換句話說,如果數據庫操作失敗,它會稍微等待一段時間,然後再次嘗試,最後會失敗多次。

您似乎從您的字典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或一個空字符串。你也可能想要做你現在正在做的事(引發一個例外)。

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