Win10,  持续记录,  知识积累,  长篇积累

数据压缩测试、字典、固实压缩、熵及其作用

本文于2021年1月30日由AlvinCR更新

一:压缩原理

1 压缩前提

首先需要明白压缩这个技术为什么能存在,首先先联想一下我们生活中的压缩,能够压缩的东西必须要有空隙,例如海绵中有大量的空气,因此才能把它压扁,而铁锭中就没有空气,很难再进行压缩。

计算机中的压缩亦是如此,但在压缩文件中,需要的不是空气,而是重复的内容。2^16=65536,理论上一个字就有这么多种表示方法,但是并不是每个字出现的概率都相同,有些字出现的概率就会高很多,同样使用这个字组成的词的概率 并不相同,而是某个特定的词使用次数更多,这就是文件中的“空气”。

一篇小说中会多次出现主角的名字,如果这个主角叫alvincr,那么我就可以用x来表示alvincr,在压缩的过程中遇到alvincr就替换成x,这样就能节省很多字母,解压的时候遇到x就变成alvincr,那么文件就又回来了。

假如有一个文件是写了一千遍的alvincr,

那么压缩的时候既可以直接用x替换alvincr,然后再统计x的数量为1000,最终输出的结果很可能就是这样的:x-?1000(假设这里-表示转义符,-?用于表示重复的次数)

如果我将alvincr重复无穷次,那么最后压缩的效率甚至能达到:1000000:1(个人随意写的数字,并没有做具体实验)

使用记事本打开效果:

2 压缩

压缩后的文件会变成:规则表+内容+附录 的形式,当我们进行解压的时候需要去查找解压的规则,即查找究竟X代表的是什么,是alvincr.com?还是alvincr?

压缩分为无损压缩和有损压缩,对于准确性要求不高的文件可采用有损压缩的形式,例如打电话时即使损失了一些原有的细节,也不会影响通话的质量;但是对于我写的文章,如果压缩软件进行有损压缩,你可能就完全看不出来我原来写的什么了。

具体内容参考:第四部分

3 字典

通过将文本中比较长且出现次数较多的文字,替换成特定的ASCII码,例如将alvincr.com替换成01,01就是alvincr.com的字典,因此如果文本是:本文来自alvincr.com,那么压缩后就会变成:本文来自01,这样就能大幅度减少文字的长度。

虽然字典设置的越大,压缩后的文件越小,但是压缩速度会变慢,资源消耗变大。从上图可以看出rar默认使用4MB的字典,rar5使用32MB字典。

字典设置的越大,那么能够处理的内容就越多,当字典空间耗尽后将会重新启动一个新字典,在运行字典的时候,整个字典全都保存在内存中,因此如果内存容量较小的用户,还是不要将字典设置那么大,经过下文测试(压缩选项-部分)发现rar的32MB字典完全能够实现压缩的效果。

二:压缩选项

1 压缩方式

从存储—>最好,压缩速度依次减慢,但是压缩效果依次增强。

个人测试:为了真实感受一下压缩方式对压缩大小的影响,alvincr折腾了一下电脑,测试文件包含多种格式的文件以防止偏差,不过由于样本还是比较少,只能作为参考使用,我以前在压缩一个4GB的文件中发现:使用zip压缩最后为4GB,但是使用rar5-1024MB-固实压缩,直接将文件压缩成300MB的大小,下图是记录的关于各种压缩方式的对比。

可以看出源文件142MB,使用存储压缩方式基本上没有压缩任何内容,甚至还使占用空间变大了???使用rar5压缩的程度比rar高出2%左右,使用固实压缩效果相当好,相比于正常压缩,压缩程度提升10%。除此之外,使用zip-32KB-标准压缩后的大小与rar-4MB-标准差不多。

此外个人还测试了4M的小文件,发现rar5压缩出来的大小比rar更大,可能是字典导致的这个结果,个人认为对于这种小文件,使用rar5压缩并没有什么意义(这种小文件压缩应该会有专门的压缩工具例如gzip、tar,这些在网页传输中十分有用)。

2 固实压缩

固实压缩文件是一种特殊压缩方式存储的压缩文件,它把压缩文件中的全部文件都当成一个连续数据流来看待。固实压缩文件只支持 RAR、7Z 格式的压缩文件,ZIP 压缩文件永远是非固实的。RAR与7z的的压缩文件可由用户决定选择固实或非固实的压缩方式。

固实压缩可增加压缩性能,特别是在添加大量的小文件的时候。要从固实的压缩文件解压单个文件时,它之前的文件都需先经过分析。这造成当从固实的压缩文件内取出文件时会比一般压缩文件取出文件慢一些。但是,当从固实的压缩文件解压全部的文件时,解压速度并没有影响。 如果在固实压缩文件中的任何文件损坏了,要从损坏的范围中解压全部的文件是不可能的。–Baike

AlvinCR总结:固实压缩将所有文件看成一个整体,不对个体进行压缩,因此对于小文件的压缩效果会非常的好。可以这么想:压缩相当于给文件分配帐篷,文件越多需要分配的帐篷越多,这样就会给分配人员造成负担,但是如果将所有文件都分配在一个帐篷中,就只需要把帐篷做的大一点,就省下很多工序了。

因此在解压的时候需要将整体拆成个体,这就需要一定的时间。

三:计算信息熵

信息是一个非常抽象的概念。人们常说信息多,或者信息少,但很难说到底有多少信息。例如,一本50万字的中文书包含多少信息。直到1948年香农提出“信息熵”的概念,他才解决了信息的定量测量问题。信息熵是C.E.香农从热力学中借用的一个词。热力学中的热熵是表征分子状态无序程度的物理量。Shannon用信息熵的概念来描述信息源的不确定性。–baike

1 香农公式

C=W log2(1+S/N)

C是数据速率的极限值,单位bit/s;W为信道带宽,单位Hz;S是信号功率(瓦),N是噪声功率(瓦)。–Baike

从香农公式可以看出,增大传输速率的最好办法是增大信道带宽,通过增加信号攻略的方式在较低水平内有效,随着功率的提高,传输速率的提升会越来越小。此外在计算机中我们经常会看到很大的数,比如4,294,967,296,如果表示成2^32会占用更少的内容并且容易识别。在数据速率中使用对S/N使用lg进行表示,因此就出现了SNR表示,即:使用分贝来表示噪声。

使用SNR来表示信噪比可以推出:SNR=10lg(S/N),可以得到S/N=10^(SNR/10)

2 熵

熵的概念起源于物理学,用来衡量热力学系统的混乱程度。在信息论中,熵是不确定性的度量。但在信息世界中,熵越高,传递的信息就越多。熵越低,传递的信息就越少。

英语文本数据流的熵很低,因为英语容易阅读,也就是说,很容易预测。即使我们不知道下一篇英文文本是什么,我们也很容易预测,例如,字母e总是比字母z更有可能,或者曲字母的组合总是比Q和任何其他字母的组合更有可能。如果没有压缩,英文文本的每个字母都需要8位编码,但实际上英文文本的熵只有4.7位。

如果压缩是无损的,即通过解压缩可以100%恢复原始消息内容,则压缩消息所携带的信息与未压缩的原始消息一样多。压缩后的消息可以通过较少的比特进行传输,因此每条压缩消息都可以携带更多的信息,也就是说,压缩信息的熵较高。较高的熵意味着更难预测压缩消息所携带的信息,因为压缩消息中不存在冗余,也就是说,每一位消息都携带着一位信息。Shannon的信源编码定理表明,任何无损压缩技术都不能允许一条消息携带超过一位的信息。消息的熵乘以消息的长度决定消息可以携带多少信息。

——WIKI

个人理解:计算机中的熵如同物理中的熵一样,都是熵值越大,能够保存的内容越多。比如水的熵越大,水的温度就越高,信息的熵越大,存储的信息量越大。虽然熵越高能携带的信息量越大,但是识别文本中的信息所需要耗费的资源越多,就像水的温度越高,就越需要质量更好的杯子去装水一样,也可以理解为:被管理的人越不服从管教,那么管理所消耗的人力就越多。

参考:https://zh.wikipedia.org/wiki/%E7%86%B5_(%E4%BF%A1%E6%81%AF%E8%AE%BA)

四:压缩方式(2021.1.29补充)

压缩分为有损压缩和无损压缩,有损压缩一般应用于图像文件,因为图像即使部分内容丢失,基本也不会影响实际效果,但是对于文本就不能采用有损压缩了,只能采用压缩程度更低的无损压缩。

下文参考:WIKI

1 有损压缩

1.1 概念

有损数据压缩又称破坏性资料压缩、有损压缩、有损压缩、不可逆压缩,是因为:有损数据压缩通过将次要的数据舍弃,牺牲一些质量来大量减少数据量、提高压缩比。这种方法经常用于压缩多媒体数据(音频、视频、图片),尤其常用于流媒体以及互联网电话领域。根据各种格式设计的不同,有损数据压缩都会有间接地损失——每次压缩与解压文件都会带来质量的逐步下降。

1.2 压缩效果

有损方法通常用于压缩声音、图像和视频。有损视频编解码器几乎总能获得比音频或静止图像好得多的压缩比(压缩比是压缩文件与未压缩文件的比率)。音频可以实现10:1的压缩比,而不会有任何感知到的质量下降,视频可以实现非常大的压缩比,如30033601,观察质量略有下降。有损静止图像压缩往往能像音频一样得到原始大小的1/10,但质量下降更明显,特别是仔细观察的时候。

1.3 压缩方法

本部分转载自:https://blog.csdn.net/cordova/article/details/53206067

1.3.1 有损量化5-5-5和5-6-5

压缩对象使图像的RGB通道值,每个值都是0~255之间的数字,分别使用8位保存,因此原始图像每个像素要使用3*8=24位,即‘8-8-8’。这里要将其量化压缩,使用16位来保存24位的信息,因此要损失部分精度,压缩率固定为1.50。

5-5-5指的是只使用低15位,剩下的一位弃用,这样每个通道一致的都压缩为5位;

5-6-5则是充分使用了16位,其中G通道占6位,另外两通道各占5位。

1.3.2 通道游长编码无损压缩

压缩过程:

压缩后的数据形式是:两个无符号8位二进制数为一组,第一个存储重复的个数,第二个存储通道值。分B,G,R三个通道依次进行,对于每个通道从第一个值开始,计算后面相同的值的个数,碰到新的不同值或者重复个数超出了8位数的表示上限,则将之前的重复值和通道值保存到一组压缩后的数据中,并开始下一组同样的计算压缩,直到所有数据全部压缩完。

解压过程:

解压也是分三个通道依次解压,由于三个通道的压缩数据都放在了同一个数组,因此先要找到G通道和R通道的开始位置offset_g和offset_r,寻找方法是循环同时累加计算前面通道各像素的重复个数,每当重复个数达到图片像素个数,下一个即时另一个通道的开始了。之后开始解压,每次从各通道取一个值组成一个像素,直到各通道同时取完,解压后的数据就是压缩前的原数据了,实现了图像的无损压缩。

AlvinCR总结:通过将三段数据压缩成一组数据,来减少文件大小,记录这三段数据的重复个数和通道数值将其放入两段中,如果这两段内容不够记录,那么再生成新的两段进行记录,直至完成。

1.3.3 量化压缩与无损压缩组合

直接使用该算法对图像压缩,面对色彩变化丰富的图像总是压缩失败的,但如果先对图像进行有损量化,再对量化后的图像进行无损压缩往往可以取得不错的效果。量化实际上是为无损压缩提高了容错性,本来两个通道值相差可能很小,如果能包容这微小的差异那么将大大提高压缩率。下图中打印的三个压缩率依次是:直接压缩的压缩率、有损量化的压缩率、对量化后的图像再进行无损压缩的压缩率。

AlvinCR总结:通过找到文件中共同的部分进行,将其划分成不同的区域,在这划分的过程中采用有损压缩,以尽可能的使其统一。随后再将各部分进行无损压缩,这样就能实现比较高的压缩程度并保持较高的准确性。

2 无损压缩

原地址:https://zh.wikipedia.org/wiki/%E6%97%A0%E6%8D%9F%E6%95%B0%E6%8D%AE%E5%8E%8B%E7%BC%A9

变动长度编码法 (RLE) – 一个非常简单的方法,在资料连续重复的情况下有不错的压缩率

LZ77与LZ78、LZW – 用于GIF和多种应用

LZF – 基本的LZ压缩法(deflate),对于快速压缩有做优化(Lempel-Ziv Fast)

DEFLATE – 用于gzip、ZIP (从2.0版开始),也是PNG、点对点协议(PPP)、HTTP、SSH的一部分

bzip2 – 使用Burrows-Wheeler变换,速度较DEFLATE慢但压缩率更高

LZMA – 用于7zip、xz等程序,相较于bzip2有更好的压缩率和更快的速度

LZO – 专为高速压缩/解压缩设计的方法,代价是压缩率较差

Statistical Lempel Ziv – 结合统计方法和字典方法,相较于只采用单一方法有更好的压缩率

Brotli – 一个现代的基于LZ的压缩方法,速度大约与DEFLATE一样快,但拥有与LZMA相近的压缩率

AlvinCR总结:这是每个算法对应的程序,不同算法适用于不同的情况。

3 区别与联系

如果要保留源文件的全部信息,信息论表明,无论采用何种压缩方法,文件大小都不能小于一个下限。压缩后的zip文件会比源文件小,但重复压缩同一个文件不会使文件大小为零,因为源文件包含一定量的信息。AlvinCR个人测试如下:

可以发现如果对压缩文件再进行压缩,压缩包不会变小而是会变大。

有损压缩可以打破这一限制。在许多情况下,数据包含的信息会超出需要。例如,如果照片的分辨率太高,细节可能无法被肉眼识别;同样,在高音量音频剪辑中,一些细节可能是人耳无法察觉的。通过抛弃人类无法察觉的细节,我们可以使用少量的信息来提供类似于原始信息的感官体验。有时为了获得更好的压缩比,允许丢失一些可感知的细节。

附:

WinRAR

WinRAR is a trialware file archiver utility for Windows, developed by Eugene Roshal of win.rar GmbH. It can create and view archives in RAR or ZIP file formats, and unpack numerous archive file formats.

此外:WinRAR 采用标准的无损压缩,因此可以放心对数据进行压缩。

视频码率

分辨率320×240 码率200-384kbps;

分辨率640×480 码率768-1024kbps;

分辨率1280×720(720p) 码率2048-3072kbps;

分辨率1920×1080(1080p) 码率5120-8192kbps。

假如我们现在压缩一个视频同时需要尽量保证视频的画质,此时我们需要调整的参数就是视频大小,也就是改变了视频分辨率,压缩视频分辨率就需要同样压缩码率,例如原视频是码率3000,调整码率到500输出的就会是1/6大小。但这个调整压缩是有比例和要求的,要压缩码率又保持视频清晰度,必须是原视频的码率相对分辨率是超高,例如原视频分辨率480p码率3000,压缩到分辨率480p码率500依然能效果不错,因为480p分辨率大小只需要码率500就能保证清晰度,原视频的码率3000其实是无意义的大;如给一个分辨率很高的视频设置一个极低的码率,结果就是清晰度惨不忍睹,如果视频是由高分辨率转换为低分辨率的话,建议码率也要相应的降低。至于帧率不建议修改。
作者:万兴喵影
链接:https://www.zhihu.com/question/23876811/answer/1672432530

一条评论

Leave a Reply

邮箱地址不会被公开。 必填项已用*标注

数据压缩测试、字典、固实压缩、熵及其作用