python3中的_pickle不适用于大数据保存

时间:2015-04-17 16:01:21

标签: python pickle

我正在尝试应用_pickle将数据保存到磁盘上。但是在调用_pickle.dump时,我收到了错误

OverflowError: cannot serialize a bytes object larger than 4 GiB

使用_pickle这是一个严格的限制吗? (cPickle for python2)

3 个答案:

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

查看文档:

http://www.picklingtools.com/html/faq.html#python-c-extension-modules-new-as-of-picklingtools-1-6-0-and-1-3-3

但是,这里有一个简短的总结:那里的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)。