我在尝试打开超过一定大小的搁置持久文件时遇到此异常,该大小实际上非常小(< 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())