我有一个大约 500MB 的大文本文件。我试图用python程序和命令行中的 Gzip 存档它。但是,在这两种情况下,归档文件的大小约为 240MB ,而在Windows中使用 WinRAR 进行归档时,归档文件大小约为 450KB 。这里有什么我想念的吗?为什么会有这么大的差异,我该怎么做才能达到类似的压缩水平?
我也用Python标记了这个,因为任何关于此的python代码都会非常有用。
以下是file的前3行:
$ head 100.txt -n 3
31731610:22783120;
22783120:
45476057:39683372;5879272;54702019;58780534;30705698;60087296;98422023;55173626;5607459;843581;11846946;97676518;46819398;60044103;48496022;35228829;6594795;43867901;66416757;81235384;42557439;40435884;60586505;65993069;76377254;82877796;94397118;39141041;2725176;56097923;4290013;26546278;18501064;27470542;60289066;43986553;67745714;16358528;63833235;92738288;77291467;54053846;93392935;10376621;15432256;96550938;25648200;10411060;3053129;54530514;97316324;
答案 0 :(得分:4)
文件可能是高度冗余的,重复模式大于32K。 gzip的deflate只看到32K回来比赛,而其他人可以更进一步利用历史。
更新
我刚制作了一个64K的随机数据块,重复4096次(256 MB)。 gzip(32K窗口)对冗余是盲目的,因此无法压缩它。 gzip将其扩展到256.04 MB。 xz(LZMA,8 MB窗口)将其压缩为102 KB。
答案 1 :(得分:1)
WinRAR和Gzip是两种截然不同的压缩程序。它们各自使用不同的算法来压缩数据。以下是维基百科中每种类型的描述:
RAR第3版基于Lempel-Ziv(LZSS)和部分匹配(PPM)压缩预测,特别是Dmitry Shkarin对PPMII的PPMd实施。
和Gzip:
它基于DEFLATE算法,它是Lempel-Ziv(LZ77)和霍夫曼编码的组合。
en.wikipedia.org/wiki/Gzip
我的猜测是如何通过部分匹配预测和霍夫曼编码工作之间的某种差异。该文件虽然具有非常有趣的属性......文件是什么?