"RuntimeError: dictionary changed size during iteration" ; Good atomic copy operations?

robert no-spam at no-spam-no-spam.com
Sat Mar 11 06:49:14 EST 2006


robert wrote:

> 
>> Is a copy.deepcopy  ( -> "cPickle.dump(copy.deepcopy(obj),f)" ) an 
>> atomic opertion with a guarantee to not fail?
>>
>> Or can I only retry several times in case of RuntimeError?  (which 
>> would apears to me as odd gambling; retry how often?)
> 
> 
> For an intermediate solution, I'm playing roulette:
> 
>     for i in 1,2,3:
>         try:
>             cPickle.dump(obj, f)
>             break
>         except RuntimeError,v:
>             pass
> 

hmm..

     for i in 1,2,3:
         try:
             cPickle.dump(obj, f)
             break
         except RuntimeError,v:
             f.seek(0);f.truncate(0)


Meanwhile I think this is a bug of cPickle.dump: It should use .keys() 
instead of free iteration internally, when pickling elementary dicts. 
I'd file a bug if no objection.

Robert


> I hope this works for some million years ...
> 
> 
> 
>> PS: Zope dumps thread exposed data structes regularly. How does the 
>> ZODB in Zope handle dict/list changes during its pickling operations?



More information about the Python-list mailing list