Compression 对于4KB的小文件,最好的压缩算法是什么?

Compression 对于4KB的小文件,最好的压缩算法是什么?,compression,Compression,我试图压缩TCP数据包,每个数据包的大小约为4KB。数据包可以包含任何字节(从0到255)。我发现所有关于压缩算法的基准测试都是基于更大的文件。我没有找到任何东西来比较小文件上不同算法的压缩比,这正是我所需要的。我需要它是开源的,所以它可以在C++上实现,所以没有RAR。对于大小约为4 KB的小文件,可以推荐什么算法 所有这些算法都值得尝试。正如您所说,它们并没有针对小文件进行优化,但您的下一步就是简单地尝试它们。测试压缩一些典型的数据包可能只需要10分钟,看看结果是什么大小。(也尝试不同的压缩

我试图压缩TCP数据包,每个数据包的大小约为4KB。数据包可以包含任何字节(从0到255)。我发现所有关于压缩算法的基准测试都是基于更大的文件。我没有找到任何东西来比较小文件上不同算法的压缩比,这正是我所需要的。我需要它是开源的,所以它可以在C++上实现,所以没有RAR。对于大小约为4 KB的小文件,可以推荐什么算法

所有这些算法都值得尝试。正如您所说,它们并没有针对小文件进行优化,但您的下一步就是简单地尝试它们。测试压缩一些典型的数据包可能只需要10分钟,看看结果是什么大小。(也尝试不同的压缩标志)。从生成的文件中,您可能会选择哪个工具工作得最好

你列出的候选人都是优秀的第一次尝试。你也可以试试bzip2


有时,当测试很容易进行时,简单的“全部尝试”是一个很好的解决方案。。思考太多有时会让你慢下来。

我认为文件大小无关紧要——如果我没记错的话,GIF中的LZW每隔4K重置一次字典。

ZLIB应该可以。它用于MCCP


但是,如果您确实需要良好的压缩,我会对常见模式进行分析,并在客户机中包含它们的字典,这样可以产生更高级别的压缩。

我按照Arno Setagaya在回答中的建议做了:做了一些示例测试并比较了结果

压缩测试使用5个文件完成,每个文件的大小为4096字节。这5个文件中的每个字节都是随机生成的

重要提示:在现实生活中,数据不可能都是随机的,但往往会有少量重复的字节。因此,在实际应用中,压缩比下面的结果要好一些

注意:5个文件中的每一个都是自己压缩的(即,不与其他4个文件一起压缩,这将导致更好的压缩)。在下面的结果中,为了简单起见,我只使用了5个文件的大小之和

我加入RAR只是为了比较,尽管它不是开源的

结果:(从最好到最差)

LZOP:20775/20480*100=原始尺寸的101.44%

RAR:20825/20480*100=原始尺寸的101.68%

LZMA:20827/20480*100=原始尺寸的101.69%

邮政编码:21020/20480*100=原尺寸的102.64%

BZIP:22899/20480*100=原尺寸的111.81%

结论:令我惊讶的是,所有经过测试的算法都产生了比原始算法更大的尺寸!!!我想它们只适用于压缩较大的文件,或者有大量重复字节的文件(而不是像上面那样的随机数据)。因此,我不会对我的TCP数据包使用任何类型的压缩。也许这些信息对那些考虑压缩小片数据的人来说是有用的。 编辑:
我忘了提到我对每种算法都使用了默认选项(标志)。

我很幸运地直接使用了zlib压缩库,而没有使用任何文件容器。ZIP、RAR都有存储文件名之类的开销。我已经看到,这种压缩方式对小于200字节的数据包产生了积极的效果(压缩小于原始大小)。

选择最快的算法,因为您可能关心实时执行此操作。通常,对于较小的数据块,算法的压缩量大致相同(给定或获取几个字节),这主要是因为除了有效负载之外,算法还需要传输字典或哈夫曼树

我强烈推荐Deflate(由zlib和Zip使用),原因有很多。该算法非常快速,经过良好测试,获得BSD许可,是Zip所需支持的唯一压缩(根据infozip Appnote)。除了基本内容外,当它确定压缩比解压缩的大小大时,还有一种存储模式,它只为每个数据块添加5个字节(最大数据块为64k字节)。除了存储模式外,Deflate还支持两种不同类型的哈夫曼表(或字典):动态和固定。动态表意味着哈夫曼树作为压缩数据的一部分传输,并且是最灵活的(对于各种类型的非随机数据)。固定表的优点是所有解码器都知道该表,因此不需要包含在压缩流中。减压(或充气)代码相对容易。我已经直接基于zlib编写了Java和Javascript版本,它们的性能相当好

提到的其他压缩算法都有各自的优点。我更喜欢Deflate,因为它在压缩步骤和解压步骤上都有运行时性能

需要澄清的是:Zip不是压缩类型,它是一个容器。为了进行数据包压缩,我会绕过Zip,只使用zlib提供的放气/充气API。

您可以试试。压缩将取决于您的数据。如果有效负载上有任何封装,那么可以压缩头
  • PPP预测压缩协议
  • 使用DEFLATE压缩IP有效载荷
  • 使用LZS的IP有效负载压缩
  • IP有效负载压缩协议(IPComp)
  • 使用ITU-T V.44数据包方法的IP有效负载压缩
  • 使用IPv6控制协议的IPv6数据报压缩RFC5172协商
  • RFC5112用于信令压缩的状态特定静态字典(Sigcomp)
  • RFC3284 VCDIFF通用差分和压缩数据格式
  • RFC2118 Microsoft点对点压缩(MPPC)协议
  • 我可能忽略了其他相关的RFC