这个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数组,在类似于这个的简单情况下具有更好的性能,并且使用的值几乎相同?
2条答案
按热度按时间k2fxgqgv1#
zip和gzip所使用的deflate格式本身具有1032:1的最大压缩比。接近你得到的。
你可以做的一件事就是再次压缩它。我用gzip压缩了你的输出,结果是15822字节。事实上,它可以用gzip压缩到639字节。你只需要重复这么多次就可以恢复它。(你可以检查gzip头文件,如果有,就删除它,重复这个过程直到没有gzip头文件为止。然后进行npz解压缩和提取。)
zyfwsgd62#
例如,可以使用lzma:
或双重压缩灵感来自Mark:
对于大小为1_000_000_000(我没有10 GB的内存),我按您的方式获得972 KB,lzma获得145 KB,双压缩获得0.5 KB。
显然,这两种压缩都没有兴趣绝对优化这种人为的极端情况,* 以牺牲实际情况 *(或以牺牲算法简单性或其他任何缺点为代价)。关键是这不是免费的。***你最好用你的实际数据进行测试(如果你提供了代码生成的数据对你来说是现实的,我也可以更新我的结果)。
更新:bz2使用savez生成938字节,使用savez_compressed生成485字节。但现在我将停止压缩这个人造的箱子。好的,再来一个:zstd分别产生31 KB和388字节。