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

私はこれを複数のデータセットで実行していますが、このエラーはそのうちの1つでのみ発生し、最大のものであり、他のデータセットでは発生しません。

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 に答える