You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效保存包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:09:07