5

dictのdictをシェルフファイルに追加しようとしています:

>>> d = shelve.open('index.shelve')
>>> d
<shelve.DbfilenameShelf object at 0x21965f0>
>>> print(list(d.keys()))
[]
>>> d['index'] = index
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/bns/rma/local/python/lib/python3.1/shelve.py", line 124, in __setitem__
    self.dict[key.encode(self.keyencoding)] = f.getvalue()
_dbm.error: cannot add item to database

インデックスはやや大きいですが、大きくはありません。これは本質的にフロートの配列です。

>>> len(index)
219
>>> a = [ index[k][k1] for k in index for k1 in index[k] ]
>>> len(a)
59995
>>> all([ type(x) is float for x in a ])
True

このエラーは何ですか?また、モジュールまたはモジュールドキュメント内のどこかに、エラーが何を表しているかについての詳細情報を取得するために探す必要がありますか?エラーメッセージは、少なくとも私にとってはあまり有益ではありません:)。

4

1 に答える 1

2

私は実際に dbm モジュールで同じ問題を抱えていました。私のコードベースでは再現可能ですが、分離されたテストでは再現できません。

私の印象では、データベースが読み取られているときに書き込みを防止するロックが存在します。私の場合、データベースは〜200Kbで、〜10個のキーがあり、を挿入するtime.sleep(1)と問題が解決し、.の時点で非同期プロセスが完了していないことが示唆されdb[key] = valueます.

于 2012-08-28T20:37:54.380 に答える