PythonでのBerkeley DBを使用してDEADLOCK_WRAPエラー(はbsddb)
-
24-09-2019 - |
質問
私は、キーと値のペアの膨大なリストを格納するために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
私は複数のデータセットでこれを実行していますし、このエラーは唯一そのうちの一つ、最大のものではなく、他と発生します。
解決
私はDeadlockWrap
のものはここでは関係ないかなり確信しています。それは単に自動的にバックオフ戦略で再試行を提供する方法ですA>。言い換えれば、データベース操作が失敗した場合、それは最終的に失敗する前に、少しは再び試行する回数を待ってます。
あなたは可能性が高く、使用しているキーは、実際にデータベースに存在しないという事実に起因するとされ、あなたの辞書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
または空の文字列を返すようにしたいでしょう。また、あなたは(例外を上げる)今やっている正確に何をしたい場合があります。
他のヒント
contenttext = contentdict[key] if contentdict.has_key(key) else None
所属していません StackOverflow