2011-02-14 1 views
4

J'essaie d'ajouter un dict de dicts dans un fichier shelve:python shelve 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 
indice

est un peu grande, mais pas énorme. Il est essentiellement un ensemble de flotteurs:

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

Quelle est cette erreur? Aussi, y a-t-il quelque part dans le module ou le document de module que je devrais chercher pour obtenir plus d'informations sur ce que l'erreur représente? Le message d'erreur n'est pas très instructif, au moins pour moi :).

+0

J'aurais aussi dû dire que j'utilise python 3.1.2. – mathtick

+0

Pouvez-vous définir des éléments de l'étagère à tous? Par exemple, si 'index' est un int, obtenez-vous le même plantage? Qu'en est-il d'un dict, ou d'une dictée plus petite de dicts? – Andrew

+0

Je devrais avoir mentionné que ... il semble bien fonctionner pour une petite liste ou dict que je l'ai testé avec. – mathtick

Répondre

1

J'ai effectivement eu le même problème avec le module dbm, il est reproductible dans mon code de base mais je ne peux pas le reproduire dans un test isolé. J'ai l'impression qu'il y a un verrou qui empêche l'écriture lors de la lecture de la base de données. Dans mon cas, le db est ~ 200Kb, avec ~ 10 touches et l'insertion d'un time.sleep(1) résoudrait le problème, laissant présager un processus asynchrone non terminé au moment du db[key] = value.

+0

Voici des liens vers des problèmes similaires: http://issues.roundup-tracker.org/issue1017587 et http://markmail.org/message/joqtmews3iwkcvtu#query:+page:1+mid:joqtmews3iwkcvtu+state:results –

Questions connexes