如何高效保存包含NumPy数组的Python字典?
解决大规模NumPy数组字典存储/读取慢的问题
嘿,针对你遇到的pickle处理大规模数据集时打包解包太慢的问题,我给你几个实用的解决方案,都是工业界常用的路子:
1. 使用HDF5格式(推荐用于数值型数组)
HDF5是专门为大规模数值数据设计的存储格式,支持分块读写、数据压缩,而且不需要一次性加载整个数据集到内存——这对超大数组来说太关键了。
代码示例(用h5py库)
import h5py import numpy as np # 你的原始字典 dictionary = {'first': np.array([1,2,3,4,5]), 'second': np.array([1,2,3,4,5])} # 保存到HDF5文件(可选gzip压缩节省磁盘空间) with h5py.File('data.h5', 'w') as f: for key, arr in dictionary.items(): f.create_dataset(key, data=arr, compression='gzip') # 读取时可以按需加载特定数组,不用全读 with h5py.File('data.h5', 'r') as f: loaded_dict = {} # 比如只加载'first'数组 loaded_dict['first'] = f['first'][()] # 或者加载所有 loaded_dict = {key: f[key][()] for key in f.keys()}
优势:读写速度远快于pickle,支持部分加载,压缩率高,适合TB级别的数值数据。
2. 使用Feather格式(兼顾速度和易用性)
Feather是pandas和R联合开发的轻量级格式,专门为快速数据交换设计,读写速度极快,文件大小也适中。
代码示例
import pandas as pd import numpy as np dictionary = {'first': np.array([1,2,3,4,5]), 'second': np.array([1,2,3,4,5])} # 转成DataFrame保存 df = pd.DataFrame(dictionary) df.to_feather('data.feather') # 读取并转回字典+NumPy数组 loaded_df = pd.read_feather('data.feather') loaded_dict = {col: np.array(loaded_df[col]) for col in loaded_df.columns}
优势:API简单,读写速度几乎是pickle的数倍,跨语言兼容(可以和R互通),适合中等到大规模的数值数据场景。
3. 使用NumPy原生压缩格式(纯NumPy数组场景)
如果你的字典里全是NumPy数组,用np.savez_compressed是最直接的选择——它针对NumPy数组做了优化,比pickle更高效。
代码示例
import numpy as np dictionary = {'first': np.array([1,2,3,4,5]), 'second': np.array([1,2,3,4,5])} # 打包压缩保存 np.savez_compressed('data.npz', **dictionary) # 读取 loaded_data = np.load('data.npz') loaded_dict = {key: loaded_data[key] for key in loaded_data.keys()}
优势:无需额外安装库(依赖NumPy即可),压缩后的文件小,读写速度快,适合纯NumPy数组的简单场景。
4. 使用Parquet格式(大数据生态兼容)
Parquet是列式存储格式,是大数据领域的标准格式之一,支持高效压缩、分区存储,能和Spark、Dask等分布式计算工具无缝配合。
代码示例
import pandas as pd import numpy as np dictionary = {'first': np.array([1,2,3,4,5]), 'second': np.array([1,2,3,4,5])} # 转DataFrame保存(用snappy压缩) df = pd.DataFrame(dictionary) df.to_parquet('data.parquet', compression='snappy') # 读取转回字典 loaded_df = pd.read_parquet('data.parquet') loaded_dict = {col: np.array(loaded_df[col]) for col in loaded_df.columns}
优势:列式存储在查询特定列时速度极快,压缩率高,支持分布式处理,适合需要和大数据系统交互的场景。
场景总结
- 纯NumPy数组+按需加载:选HDF5或
np.savez_compressed - 兼顾易用性和速度:选Feather
- 大数据生态兼容:选Parquet
内容的提问来源于stack exchange,提问作者Abhiraj Patwa
相关产品推荐
相关产品推荐

