挑干的说
python pickle 序列化大于4GB文件,在使用python3.4以上版本时,只需要指定protocol=4
关键字参数即可。其他版本需要将数据分块。
关于协议版本
pickle
目前有6个不同的协议版本。越高版本的协议所需的Python版本越新。
- protocol 0:是最初的协议,是“人类可读”的协议,向后兼容早期版本的Python。
- protocol 1:是一个古老的二进制格式,向后兼容早期版本的Python。
- protocol 2:是在Python 2.3中引入的。它提供了对新类型更有效的存取。查看PEP 307 来了解 protocol 2 改进的细节。
- protocol 3:是在Python 3.0中引入的。它明确的支持字节(bytes)对象,并且不能被Python 2.x存取。 这是Python 3.0 -3.7使用的默认协议。
- protocol 4:是在Python 3.4中引入的。它增加了对非常大的对象的序列化支持,以及可以序列化更多种类的对象,做了一些数据格式的优化。这是从Python 3.8开始使用的默认协议。查看PEP 315来4 了解protocol 4 改进的细节。
- protocol 5:是在Python 3.8中引入的。它增加了对out-of-band数据的支持,以及对in-band数据的加速和优化。 查看PEP 315来4 了解protocol 5 改进的细节。
pickle.HIGHEST_PROTOCOL
一个整数,可用的最高协议版本。 这个值可以作为协议值传递给dump()和dumps()函数以及Pickler构造函数。
pickle.DEFAULT_PROTOCOL
一个整数,用于pickle
的默认协议版本。 可能小于HIGHEST_PROTOCOL
。 目前的默认协议是4。默认协议是首次在Python 3.4中引入的。
测试代码:
#导入
import numpy as np
import pickle
#序列化
pickle_protocol=4
data=np.random.random((30000,30000))
with open ("pkl.pkl", 'wb') as f:pickle.dump(data, f, protocol=pickle_protocol)
#反序列化
with open ("pkl.pkl", 'rb') as f: data2=pickle.load(f)
#测试数据一致性
(data==data2).all()
True
测试截图
参考:
pickle文档