python shelve dbm错误?

5 投票
1 回答
2197 浏览
提问于 2025-04-16 11:48

我正在尝试把一个字典的字典添加到一个shelve文件里:

>>> 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

这个错误是什么呢?另外,在这个模块或者模块的文档里,有没有我可以查找更多关于这个错误的信息的地方?这个错误信息对我来说不是很有帮助 :)。

1 个回答

2

我其实也遇到过和这个dbm模块一样的问题,这个问题在我的代码里能重现,但在单独测试的时候却无法重现。

我的感觉是,当数据库在被读取的时候,有一个锁会阻止写入。在我的情况中,数据库大约有200Kb,里面有大约10个键。如果我在插入的时候加上time.sleep(1),问题就能解决,这说明在执行db[key] = value的时候,可能有某个异步的进程还没有完成。

撰写回答