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

Jak*_*x32 33 python pickle

我正在尝试申请_pickle将数据保存到磁盘上.但是在打电话时_pickle.dump,我收到了一个错误

OverflowError: cannot serialize a bytes object larger than 4 GiB
Run Code Online (Sandbox Code Playgroud)

这是一个难以使用的限制_pickle吗?(cPickle对于python2)

Eri*_*eil 67

在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)
Run Code Online (Sandbox Code Playgroud)

  • @ 1a1a11a最好使用“ with”语句打开文件,以确保关闭文件。但是,对pickle.dump的调用返回后,对文件对象的引用计数将降至零,因此它将立即收集垃圾,并且无论如何将关闭文件。 (2认同)

Mar*_*ers 6

是的,这是一个硬编码限制;从save_bytes功能

else if (size <= 0xffffffffL) {
    // ...
}
else {
    PyErr_SetString(PyExc_OverflowError,
                    "cannot serialize a bytes object larger than 4 GiB");
    return -1;          /* string too large */
}
Run Code Online (Sandbox Code Playgroud)

该协议使用 4 个字节将对象的大小写入磁盘,这意味着您最多只能跟踪 2 32 == 4GB 的大小。

如果您可以将bytes对象分解为多个对象,每个对象都小于 4GB,当然您仍然可以将数据保存到泡菜中。