Python使用pickle高效存储与读取大型列表和字典数据
本文介绍利用Python pickle模块存储和读取大型列表及字典数据的方法。重点解析pickle协议参数protocol的作用,推荐使用pickle.HIGHEST_PROTOCOL以提升序列化速度、减少文件体积并支持超大对象,从而优化大数据持久化存储效率。
Python pickle存储与读取大数据方案
本节主要介绍如何在Python中使用pickle模块来存储和读取数据量较大的列表与字典对象。
面对数据规模庞大的列表或字典,将其序列化为数据包进行调用是一种有效策略,能够显著减小文件体积并提升调用效率。
#列表
#存储
list1 = [123,'xiaopingguo',54,[90,78]]
list_file = open('list1.pickle','wb')
pickle.dump(list1,list_file)
list_file.close()
#读取
list_file = open('list1.pickle','rb')
list2 = pickle.load(list_file)
print(list2)
#字典
#存储
list3 = {'12': 123, '23': 'xiaopingguo', '34': 54, '45': [90, 78]}
list3_file = open('list3.pickle', 'wb')
pickle.dump(list3, list3_file)
list3_file.close()
# # 读取
list3_file = open('list3.pickle', 'rb')
list3 = pickle.load(list3_file)
print(list3)
print(list3['23']
接下来,我们将通过具体示例展示如何利用pickle处理大规模数据。
在处理某项数据任务时,遇到一个体积巨大的字典型中间变量。由于该变量需要在后续工作中被持久化且高频访问,因此考虑将其保存为类似Matlab .mat格式的数据文件,以便随时快速读取。
自然想到的方案是使用pickle保存数据,因为这是Python环境中最常用且最简单的数据存储方式。Python存储数据的方法多样,除了pickle,还可以选择JSON、TXT等格式。至于其他如pandas、H5等方式,此处暂不展开讨论。
(注:pandas、H5等其他存储方式此处略过。)
pickle模块原理与局限性
关于pickle模块的基本介绍。
pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议。其中,序列化(pickling)是将Python对象层次结构转换为字节流的过程;反序列化(unpickling)则是将字节流还原为对象层次结构的过程。
需要注意的是,pickle是Python特有的机制,非Python程序通常无法直接重构pickle对象。在实际工作中,我曾遇到一个案例:使用sklearn训练得到的机器学习模型通过pickle保存后,工程部门的同事无法直接用Java调用该模型。当时有一位同事通过阅读pickle源码,手动用Java一步步实现了反序列化,这种做法令人佩服。
优化大数据序列化的关键技巧
以下是pickle使用的关键技巧。
对于简单的代码场景,直接使用dump()和load()函数即可满足需求。
import pickle
a = 1
# 保存
with open('data.pickle', 'wb') as f:
pickle.dump(data, f)
# 读取
with open('data.pickle', 'rb') as f:
b = pickle.load(f)
然而,如果查阅pickle的官方文档,会发现存在一个名为protocol的参数。该参数代表序列化协议(pickle协议),在Python 2.x版本中默认值为0,而在Python 3.x版本中默认值为3。简而言之,不同的Python版本对应不同的最高协议支持,且protocol值越大,代表的协议版本越高。具体对应关系如图所示。
修改protocol参数会产生什么影响?通常情况下,protocol值越大,dump操作的速度越快,支持的数据类型也更多,保存下来的文件占用的磁盘空间更小。此外,它还带来其他优化,例如在Python 3.4中,协议版本4新增了对超大数据对象序列化的支持。因此,在条件允许的情况下,建议将protocol参数设置为最高协议版本,即指定protocol=pickle.HIGHEST_PROTOCOL。
基于上述技巧,前面的示例代码可以优化为以下形式:
import pickle
a = 1
# 保存
with open('data.pickle', 'wb') as f:
pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL)
# 读取
with open('data.pickle', 'rb') as f:
b = pickle.load(f)
对于小规模数据,这种差异可能并不明显。
但在处理大规模数据序列化时,请务必注意pickle的这一优化技巧。
总结。
以上内容详细介绍了Python中利用pickle存储和读取大数据量列表及字典的方法。本文提供的方案详细且实用,具有一定的参考借鉴价值,需要的朋友可以参考使用。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













