我正在尝试应用_pickle
将数据保存到磁盘上。但是在调用_pickle.dump
时,我收到了错误
OverflowError: cannot serialize a bytes object larger than 4 GiB
使用_pickle
这是一个严格的限制吗? (cPickle
for python2)
答案 0 :(得分:57)
在Python 3.4中不再有PEP 3154和Pickle 4.0
https://www.python.org/dev/peps/pep-3154/
但你需要说你想使用协议的第4版:
https://docs.python.org/3/library/pickle.html
pickle.dump(d, open("file", 'w'), protocol=4)
答案 1 :(得分:2)
是的,这是一个硬编码限制;来自save_bytes
function:
else if (size <= 0xffffffffL) {
// ...
}
else {
PyErr_SetString(PyExc_OverflowError,
"cannot serialize a bytes object larger than 4 GiB");
return -1; /* string too large */
}
该协议使用4个字节将对象的大小写入磁盘,这意味着您只能跟踪最多2个 32 == 4GB的大小。
如果你可以将bytes
对象分解成多个对象,每个对象小于4GB,你当然可以将数据保存到pickle中。
答案 2 :(得分:1)
上面有一个很好的答案,为什么泡菜不起作用。 但它仍然不适用于Python 2.7,这是一个问题 如果你仍然在Python 2.7并且想要支持大型 文件,尤其是NumPy(4G上的NumPy阵列失败)。
您可以使用OC序列化,该序列化已更新以适用于数据 4Gig。有一个Python C扩展模块可从以下网址获得:
http://www.picklingtools.com/Downloads
查看文档:
但是,这里有一个简短的总结:那里的ocdumps和ocloads,非常像 pickle's dumps and loads ::
from pyocser import ocdumps, ocloads
ser = ocdumps(pyobject) : Serialize pyobject into string ser
pyobject = ocloads(ser) : Deserialize from string ser into pyobject
OC序列化速度提高了1.5-2倍,并且可以与C ++一起使用(如果你正在使用语言)。它适用于所有内置类型,但不适用于类 (部分原因是它是跨语言的,并且构建C ++类很难 来自Python)。