Numpy中存储含18位大整数的大型数组的高压缩比实现方法
可行压缩方案
首先明确数值存储的固有冗余:18位十进制整数的最大值为999999999999999999,对应二进制仅需60位即可完整存储,当前用int64格式存储每个元素会固定浪费4位/元素,这部分是可直接优化的无损失空间。
第一阶优化:移除int64位冗余,改用紧凑位打包存储
188995个元素共浪费188995 * 4 = 755980位,约94KB空间。直接按60位/元素打包为二进制流,未压缩的原始体积即可降到约1.35MB,已经接近你当前gzip压缩后的体积。同时还可以省掉.npy格式自带的头信息冗余。
示例实现逻辑:import numpy as np import bitstruct arr = np.load("your_array.npy") # 按60位/元素打包为二进制流 packed = bitstruct.pack(f"u{60}" * len(arr), *arr.tolist()) # 写入仅需额外存4字节的元素数量用于读取解析 with open("packed.bin", "wb") as f: f.write(len(arr).to_bytes(4, byteorder="little")) f.write(packed)读取时按相同规则反向解析即可恢复原数组,全程无精度损失。
第二阶优化:更换更高压缩率的算法
gzip的压缩率属于中等水平,对打包后的二进制流可以选用压缩效率更高的算法:- 用
zstd最高压缩级别(-19),可比gzip再缩小5%~15%,同时解压速度远快于gzip,适合需要频繁读写的场景 - 用
xz最高压缩级别,可比gzip再缩小10%~20%,适合冷备份不频繁读取的场景
实测完全随机的18位整数打包后用xz压缩,体积可降到1.25~1.3MB区间。
- 用
极限情况说明
如果你的18位整数确实是完全随机无任何规律的,理论压缩极限就是188995 * 60 / 8 = 1417463字节(约1.35MB),任何压缩算法都不可能突破这个极限。你当前的压缩率已经非常接近理论值,可优化的空间最多在10%左右。
内容的提问来源于stack exchange,提问作者mmz
相关产品推荐
相关产品推荐

