2011-02-14 55 views
4

我想类型的字典字典添加到货架文件:python搁置dbm.error?

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

什么是这个错误?此外,有没有在模块或模块文件中的某处,我应该寻找更多的信息在错误代表什么?错误消息是不是很丰富,至少对我来说:)。

+0

我应该也说过我在使用python 3.1.2。 – mathtick 2011-02-14 19:13:06

+0

您可以设置搁架的元素吗?例如,如果`index`是一个整数,你会得到同样的崩溃吗?怎么样一个字典,或一个更小的字典? – Andrew 2011-02-14 19:34:16

回答

1

我实际上与dbm模块有同样的问题,它在我的代码库中是可重现的,但我无法在单独的测试中重现它。

我的印象是有一个锁可以防止在读取数据库时写入。在我的情况下,数据库是〜200Kb,用〜10个键,插入一个time.sleep(1)就可以解决问题,暗示在db[key] = value时刻某些异步处理没有完成。