我在云卷上有大约 100TiB 的压缩 gzip 数据。在运行块级重复数据删除(btrfs 的 duperemove)的过程中,我发现它是在没有 的情况下压缩的-n
,这导致其他相同文件的压缩输出在块级上存在差异。
除了使用 重新压缩所有内容之外gzip -n
,还有其他快捷方式可以让数亿个 gzip 压缩文件“丢失”该标头吗?如果我已经必须重新压缩它们,那么我是否应该研究其他优化方法,例如--rsyncable
最大限度地提高重复数据删除的机会?
(这些数据很有可能包含大量重复数据,我们谈论的是大型数据库表的每日完整转储)
答案1
您可以使用 zcat 提取文件,然后计算每个文件的校验和:
for x in *.gz
do
zcat $x | sha256sum > $x.sum
done
然后检查这些 *.gz.sum 文件是否有重复项。每次删除名为“something.gz.sum”的重复项时,也删除相应的“something.gz”
答案2
回答我关于如何截取 gzip 文件的日期/名称戳的问题的前半部分。不,我还没有找到现成的代码,但我确实找到了安装 vbindiff(一个可视化二进制差异工具)的时间,并且发现标头未被压缩,因此实际的压缩流与和相同gzip
,gzip -n
剩下的就是操作压缩文件最开头的几个字节来获得统一版本。一个小小的 C 程序就能解决我的问题,除非有人知道二进制文件sed
:-)
至于第二部分,我只需要对一堆数据进行实验。如果我有任何确定的结果,我会在这里发布。