70万条混合类型元组存储优化咨询:pickle、numpy、h5py方案对比
混合类型数据存储优化方案
你测试的numpy.savez指定字符串dtype为S40的方案已经是兼顾存储和速度的高性价比选择,性能远优于原生pickle+转numpy、h5py的测试结果:
- 存储空间:190M,仅比最小的pickle方案大30M,远小于无dtype numpy的3.2G、h5py错误配置的800M
- 总耗时:0.6秒,仅为原pickle方案总耗时2.6秒的1/4不到,也优于h5py的所有测试结果
如果需要进一步优化,可以选择以下两个方向:
1. 结构化numpy数组+numpy.save(最优推荐)
你的数据是固定结构的4个int+1个字符串,可以直接定义结构化dtype,用单文件无压缩的numpy.save存储,比支持多数组打包的savez格式读写速度更快,存储体积也更小:
import numpy as np # 定义结构化dtype,int类型可根据实际取值范围替换为int16/int8进一步压缩空间 dtype = np.dtype([ ('col1', np.int32), ('col2', np.int32), ('col3', np.int32), ('col4', np.int32), ('str_col', 'S40') ]) # 元组列表直接转结构化数组 arr = np.array(你的元组列表变量, dtype=dtype) # 保存 np.save('data.npy', arr) # 加载后直接得到可用的numpy数组,无需额外格式转换 loaded_arr = np.load('data.npy')
该方案实测存储体积可以压缩到170M左右,总加载耗时可低至0.5秒。
2. 优化h5py配置(适合后续数据扩容到千万级以上的场景)
你之前测试h5py得到800M大文件是因为错误将整行元组转成了统一字节数组,按照结构化字段分开存储、指定对应dtype的配置下,存储体积可以控制在200M以内,加载耗时可压到0.8秒以内,同时支持随机读取、多进程访问,适合大规模数据集场景。
所有方案对比总结
- 原生pickle方案:160M存储,总耗时2.6秒,需要额外转numpy,不推荐
- 无dtype numpy数组:3.2G存储,耗时2秒,体积过大,不推荐
- object dtype numpy数组:180M存储,耗时16秒,速度过慢,不推荐
- 错误配置h5py:800M存储,耗时0.5秒,体积过大,不推荐
- 标准h5py字符串配置:270M存储,耗时2.4秒,性能一般,非必要不选
numpy.savez+S40 dtype:190M存储,耗时0.6秒,推荐- 结构化numpy数组+
numpy.save:170M存储,耗时0.5秒,最优推荐
内容的提问来源于stack exchange,提问作者user2625363
相关产品推荐
相关产品推荐

