numpy 出乎意料的压缩效果差

1hdlvixo  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(103)

这个python脚本:

import numpy as np

a = np.ones((10_000_000_000), dtype='u1')
np.savez_compressed('a-zip', a=a)

生成9.7MB大文件。从理论上讲,这个数组可以压缩到小于100字节:71字节用于.npy报头,少量字节用于1的10,000,000,000个副本。为什么ZIP在这里失败得如此严重?有没有其他压缩算法可以很容易地用于NumPy数组,在类似于这个的简单情况下具有更好的性能,并且使用的值几乎相同?

k2fxgqgv

k2fxgqgv1#

zip和gzip所使用的deflate格式本身具有1032:1的最大压缩比。接近你得到的。
你可以做的一件事就是再次压缩它。我用gzip压缩了你的输出,结果是15822字节。事实上,它可以用gzip压缩到639字节。你只需要重复这么多次就可以恢复它。(你可以检查gzip头文件,如果有,就删除它,重复这个过程直到没有gzip头文件为止。然后进行npz解压缩和提取。)

zyfwsgd6

zyfwsgd62#

例如,可以使用lzma

import numpy as np
import lzma

a = np.ones((10_000_000_000), dtype='u1')
with lzma.open('a-lzma', mode='wb') as f:
    np.savez(f, a=a)

或双重压缩灵感来自Mark

with lzma.open('a-zip-lzma', mode='wb') as f:
    np.savez_compressed(f, a=a)

对于大小为1_000_000_000(我没有10 GB的内存),我按您的方式获得972 KB,lzma获得145 KB,双压缩获得0.5 KB。
显然,这两种压缩都没有兴趣绝对优化这种人为的极端情况,* 以牺牲实际情况 *(或以牺牲算法简单性或其他任何缺点为代价)。关键是这不是免费的。***你最好用你的实际数据进行测试(如果你提供了代码生成的数据对你来说是现实的,我也可以更新我的结果)。

更新:bz2使用savez生成938字节,使用savez_compressed生成485字节。但现在我将停止压缩这个人造的箱子。好的,再来一个:zstd分别产生31 KB和388字节。

相关问题