実際にはかなり小さい(< 1MB)特定のサイズを超える保留永続化ファイルを開こうとすると、この例外が発生しますが、正確な数がどこにあるのかわかりません。今、私は pickle が python のろくでなしの子のようなものであり、shelve が特に堅牢なソリューションとは考えられていないことを知っていますが、それはたまたま (理論的には) 私の問題を素晴らしく解決し、その理由を見つけることができませんでしたこの例外。
Traceback (most recent call last):
File "test_shelve.py", line 27, in <module>
print len(f.keys())
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shelve.py", line 101, in keys
return self.dict.keys()
SystemError: Negative size passed to PyString_FromStringAndSize
一貫して再現できますが、グーグルではあまり見つかりませんでした。これが再現するスクリプトです。
import shelve
import random
import string
import pprint
f = shelve.open('test')
# f = {}
def rand_list(list_size=20, str_size=40):
return [''.join([random.choice(string.ascii_uppercase + string.digits) for j in range(str_size)]) for i in range(list_size)]
def recursive_dict(depth=3):
if depth==0:
return rand_list()
else:
d = {}
for k in rand_list():
d[k] = recursive_dict(depth-1)
return d
for k,v in recursive_dict(2).iteritems():
f[k] = v
f.close()
f = shelve.open('test')
print len(f.keys())