数据压缩/评估压缩效率
当应用程序程序员决定使用哪种压缩算法时,需要权衡许多因素:[1]
- 速度:它有多快?
- 压缩率:如果它不能使我们的数据比未压缩大小更小,那就没有意义。
- 复杂度:可执行文件有多大?(这既有硬成本——软件使用多少 ROM 或磁盘空间?——也有软成本——如果我需要更改它,需要多长时间才能浏览所有源代码以找到要更改的正确内容,以及更改后,需要多长时间才能测试代码的每个部分以确保更改不会破坏其他内容?)
- 空间:运行需要多少 RAM?
- 延迟:我需要等待多久才能听到歌曲的第一段?
- 互操作性:我生成的的文件可以被任何标准归档实用程序读取吗?
当压缩库程序员调整了压缩算法并试图确定它是否真的更好或者他是否应该恢复到以前的版本时,他会使用相同的标准。
在评估数据压缩算法时,速度始终以每秒处理的未压缩数据量来衡量。
对于流式音频和视频,
- 速度 = 一秒钟内可以处理的未压缩位数。
一些应用程序即使有足够的 RAM 和磁盘空间,也不需要缩小文件大小,也会使用数据压缩技术。文件压缩和增量压缩通常用于加快从慢速连接的一端到另一端的复制文件速度。即使在单台计算机上,某些类型的操作在压缩版本的数据上执行时也要比直接在未压缩数据上执行快得多。[2] 特别是,一些压缩文件格式的设计使得压缩模式匹配——在压缩文本文件的压缩版本中搜索短语——比在原始未压缩文本文件中搜索相同的短语快得多。[3][4][5][6][7][8][9][10][11]
(“zgrep”或“zcat”在这里相关吗?)
一些专门用于压缩位图的压缩算法——字节对齐位图代码 (BBC)、字对齐混合代码 (WAH)、位置列表字对齐混合代码 (PLWAH)、压缩自适应索引 (COMPAX) 和压缩 'n' 可组合整数集 (CONCISE)——允许将位运算直接应用于压缩数据。[12] 这可能比解压缩数据、应用位运算,然后重新压缩结果快得多。
(FIXME:将以上内容的一部分移动到压缩域处理。)
在许多应用中,解压缩速度至关重要。如果在原型便携式音乐播放器硬件上运行的音频解压缩器特定实现无法持续向耳机提供 1.4 Mbit/s 的数据流,那么它就无法使用。除非您切换到不同的实现或更快的硬件(或两者兼而有之),否则没有人会购买它,这些硬件能够跟上标准立体声音频的速度。
在一些应用中,压缩速度至关重要。如果在原型语音记录器上运行的音频压缩器特定实现无法持续从麦克风向存储器提供 7 bits/sample/channel x 1 channel x 8 kSamples/s = 56 kbit/s 的数据流,那么它就无法使用。没有人希望他们的录音中出现静默间隙,因为硬件无法跟上。除非您切换到不同的实现或更快的硬件(或两者兼而有之),否则没有人会购买它,这些硬件能够跟上标准电话级语音速度。
速度在不同机器之间,不同实现之间差异很大。即使在同一台机器上,使用同一基准文件和同一实现源代码,使用不同的编译器也可能使解压缩器运行速度更快。
压缩器的速度几乎总是比其对应解压缩器的速度慢。
即使使用现代快速 CPU,压缩文件系统的性能通常受压缩算法速度的限制。许多现代嵌入式系统(以及许多早期开发数据压缩算法的计算机)在速度上受到严格限制。只有少数压缩算法足够快,可以在速度极其受限的系统上使用:[1]
- RLE;
- LZSS 家族中的算法;
- LZW 家族中的算法;
- 固定字节对编码,例如 PalmDoc;
- 增量编码 + 自适应霍夫曼。
… 还有其他吗?…
许多现代嵌入式系统(以及许多早期开发数据压缩算法的计算机)在 RAM 方面受到限制。当可用 RAM 太小,无法容纳解压缩文本和单独的字典(例如 GIF 解码器为 LZW 字典所需的 12 KB 字典)时,很少有压缩算法能够在这种限制下工作。 [13] 由于 RAM 太少,
- 如果我们需要将整个解压缩文本保存在 RAM 中(例如自解压缩可执行文件),那么我们不得不排除 LZW,并使用解压缩文本作为字典,例如 LZ77 和 Pucrunch。
- 如果我们不需要将整个解压缩文本保存在 RAM 中(例如,外部调制解调器在将明文转发到 PC 之前,通过“慢速”电话链路解压缩发送的数据),那么对于任何给定的 RAM 量,LZW 类型的压缩格式通常比 LZ77 类型的压缩格式提供更好的压缩。对于典型的英文文本,在解压缩器的字典中存储的单词和短语越多,压缩效果就越好。LZ77 使用大量 RAM 来保存经常重复出现的常用词。LZW 使用可用 RAM 来存储每个唯一词一次,因此在 RAM 受到限制时,压缩效果比 LZ77 好。
在设计压缩文件格式时,通常会在变长格式和字节对齐格式之间进行速度/空间权衡。大多数系统可以更快地处理字节对齐格式。变长格式通常提供更好的压缩。字节对齐格式可以使用除 8 位数据以外的数据大小。 [13] 例如,许多 LZ77 类型的解压缩器使用字节对齐格式,其中包含 16 位“项目”,解压缩器将其分解为 3 位长度和 13 位偏移量。一些解压缩器使用 1 位、8 位和 16 位项目的组合,其中(为了速度)1 位项目小心地打包到 8 位“控制字节”中,因此其他所有内容都可以保持字节对齐。(在本书的后面,我们将更详细地讨论字节对齐格式:数据压缩/字典压缩#实现技巧和窍门)。
在本书中,我们将压缩率定义为
能够将 2 MB 压缩文件解压缩为 10 MB 文件的算法的压缩率为 10/2 = 5,有时写为 5:1(读作“五比一”)。
对于流式音频和视频,压缩率是根据未压缩和压缩比特率而不是数据大小来定义的
例如,CD 上的歌曲以 16 bits/sample/channel x 2 channels x 44.1 kSamples/s = 1.4 Mbit/s 的数据速率进行未压缩。同一首歌曲以 (有损“高质量”) 128 kbit/s Vorbis 流(或 128 kbit/s MP3 流或 128 kbit/s AAC 文件)编码,产生的压缩率约为 11:1(“十一比一”)。
同一首歌曲使用典型的无损音频压缩器(如 FLAC 或 WavPack)进行编码,通常压缩比约为 2:1 到 3:1(“三比一”),尽管有些歌曲没有压缩(1:1),而某些类型的古典音乐使用此类无损音频压缩器可以获得高于 3:1 的压缩比。
根据此“压缩比”的定义,对于给定的未压缩文件,更高的压缩比会导致更小的压缩文件。
(不幸的是,其他一些文本将“压缩比”定义为倒数,或插入 8 或 100 等任意其他因子,或完全使用其他公式)。
文本文件无损压缩的一些典型压缩比
- 2:1 或更差:极其简单且快速的算法,如 LZRW1-a,可以在 2GHz CPU 上以压缩数据饱和 100 MB/s 硬盘。
- 文本文件的压缩比为 2.5:1 到 3.5:1:稍微复杂(因此稍微慢一些)的算法,如 DEFLATE[14]
- 5:1 不幸的是,所有已知的用于在英语文本上获得高于 5:1 压缩因子的算法运行速度都极其缓慢,在 2GHz P4 上解压缩 100 MB 未压缩数据需要 5 个小时或更长时间。
- 6.27:1 当前(2009 年)的 Hutter 奖世界纪录压缩比
所有无损数据压缩算法对不同文件的压缩比都不同。对于几乎任何数据压缩算法,都很容易人工构造一个“基准测试”文件,该文件可以以惊人的高压缩比进行压缩并无损解压缩。不幸的是,这种人工的高压缩比并不能说明这些算法在真实数据上的工作效果如何。有多种标准基准文件可用。使用大量此类基准文件可以帮助程序员避免意外地过度调整算法,使其在某个特定文件上表现出色,但在其他文件上却表现很差。
一些标准基准文件将在本书后面列出——Data Compression/References#Benchmark files.
通用压缩
[edit | edit source]一些程序员专注于“通用压缩”算法,这些算法不与任何特定格式(如文本或图像)绑定。[15][16] 这些程序员在包含各种格式的基准文件集合上调整他们的算法。
格式特定压缩
[edit | edit source]其他程序员专注于一种特定类型的文件——视频压缩、静止图像压缩、单人语音压缩、高保真音乐压缩、英语文本压缩或其他一些特定类型的文件。通常,这些格式特定程序员会尝试在原始数据中找到某种冗余,这些冗余可以用于无损压缩——例如,音乐通常有一个主音,该主音以特定频率重复多次,持续几分之一秒——但每次重复都不完全相同于其他任何重复——然后是另一个主音,以其他频率重复多次,持续几分之一秒。通常,这些格式特定程序员会尝试找到人类感知的局限性,这些局限性可以用于有损压缩。通常,这些程序员会想出一些方法来“转换”或“预处理”或“去相关”数据,然后将中间结果交给某个“通用压缩”算法。我们将在Data Compression/Multiple transformations中对此进行更详细的讨论。
对于它被调整的特定格式,这种格式特定压缩算法通常比单独的通用压缩算法提供更好的结果。不幸的是,这种算法通常比通用压缩算法对其他类型的文件提供更差的结果。
延迟
[edit | edit source]延迟是指音频信号进入系统到从系统中出来的短时间延迟(通常以毫秒为单位测量)。
压缩会增加两种类型的延迟:压缩延迟和解压缩延迟,这两者都会增加端到端延迟。
在某些音频应用中,尤其是双向电话式通信,端到端延迟至关重要。电话服务的推荐最大时间延迟为 150 毫秒[citation needed](Wikipedia:1 E-1 s)。这排除了许多流行的压缩算法。例如,标准霍夫曼压缩的块大小为 150 毫秒或更长,将无法正常工作。标准霍夫曼压缩需要分析整个块才能发送出块中第一个符号的压缩前缀码。在这种情况下,霍夫曼压缩器会用掉所有等待块填满的时间,没有时间用于飞行时间传输或解码。(150 毫秒或更长的块大小可能适用于自适应解码器)。
在其他音频应用中,端到端延迟无关紧要。在压缩歌曲以便稍后分发或压缩电影的音轨时,压缩器通常在开始压缩之前可以获得所有数据。此类应用可能会在低延迟算法足够的情况下使用低延迟算法;但它们也允许使用其他算法,这些算法可能提供更好的网络压缩或更低的峰值比特率。
在一些应用中,只有解压缩延迟很重要。例如,如果在原型便携式音乐播放器硬件上运行的音频解压缩器的特定实现的延迟为 10 分钟,那么它几乎不可用。没有人想在选择歌曲后等待 10 分钟才能开始听到它。除非您切换到不同的实现或更快的硬件(或两者兼而有之),否则没有人会购买它。
许多压缩算法具有以位为单位测量的最小信息论延迟。(是否有一个比“信息论延迟”更好的名称来描述本段和下一段讨论的内容?) 在给定恒定的未压缩比特率的情况下,这对应于从(未压缩)位进入压缩器到相应的(未压缩)位从解压缩器出来的最坏情况延迟,在比特率如此缓慢以至于我们可以忽略压缩器和解压缩器中执行的计算所需的时间以及飞行时间的情况下。
固定前缀编码器或自适应霍夫曼编码器通常具有极其短的信息论延迟。它们中的许多具有小于 16 位的延迟。
MP3 压缩器牺牲延迟和质量以获得更高的压缩比。它们的延迟至少为 576 个时域 16 位样本,以 44.1 kHz 采样,延迟至少为 9,216 位或 13 毫秒,通常更长以利用“字节库”。
能量
[edit | edit source]关于压缩算法使用的能量量,研究很少。
在一些传感器网络中,压缩的目的是节省能量。通过在 CPU 中花费少量能量压缩数据,因此我们可以减少要传输的字节数,从而节省无线电的能量——无线电可以更少地打开或更短地打开,或者两者兼而有之。[17]
此类传感器网络中最好的压缩算法是那些最小化总能量,从而最大化运行时间(两次更换电池之间的时间间隔)的算法。这种算法处于两个方面之间的利基市场:一方面,是那些产生更小的压缩文件,但使用过多的 CPU 能量来产生它们的算法;另一方面,是那些使用更少的 CPU 能量,但产生(相对)更长的文件,需要更多的能量来传输的算法。
比较
[edit | edit source]我们使用博弈论术语“支配”来表示一种算法比其他算法更快、生成更小的压缩文件并且延迟更低。当然,某些特定实现并非经过很好的优化,因此可以对其进行调整以使其运行*更快*,并且仍然以相同的压缩文件格式实现相同的算法。但任何抽象算法都必然需要一些最小操作次数,因此不可能将需要比某个当前更快算法多几个数量级的操作次数的算法优化到足以支配该更快算法的地步。
许多历史重要的压缩算法现已过时,被其他更实用的算法所取代。但目前(以及在可预见的未来),即使对于固定的一组基准文件,也不存在一种“最佳”的压缩算法——在帕累托前沿上存在许多“最佳”算法的谱系;这些算法谱系共同支配着并使所有其他已知算法过时。能够提供一些但并非大量压缩的极速算法位于帕累托前沿的一端。在帕累托前沿的另一端,是已知的压缩基准文件的最佳方式——但是,由于速度太慢,它们并没有太大的用处。
- ↑ a b "黑客数据压缩" 由安迪·麦克法登 1993 年撰写
- ↑ "压缩域处理技术调查" 由布莱恩·C·史密斯撰写
- ↑ [1] "SASE:压缩文本搜索引擎的实现" (1997) 由 Srinidhi Varadarajan 和 Srinidhi Varadarajan 和 Srinidhi Varadarajan 和 Tzi-cker Chiueh 和 Tzi-cker Chiueh 撰写
- ↑ Shmuel T. Klein 和 Miri Kopel Ben-Nissan. "关于斐波那契压缩码的有用性". 2004. 2009.
- ↑ "一种允许在压缩文件中快速搜索的文本压缩方案" 1993 年由 Udi Manber 撰写
- ↑ "压缩文本中的基于短语的模式匹配" 由 J. Shane Culpepper 和 Alistair Moffat 撰写
- ↑ 维基百科:压缩后缀数组
- ↑ Shmuel T. Klein 和 Dana Shapira. "压缩词典中的搜索".
- ↑ Carlos Avendaño Pérez 和 Claudia Feregrino Uribe. "压缩文本的近似搜索".
- ↑ Udi Manber. "一种允许在压缩文件中快速搜索的文本压缩方案".
- ↑ Yusuke Shibata,Takuya Kida,Shuichi Fukamachi,Masayuki Takeda,Ayumi Shinohara,Takeshi Shinohara,Setsuo Arikawa. "字节对编码:一种加速模式匹配的文本压缩方案" 1999 年。 "在 BPE 压缩文本中进行模式匹配比在原始文本中更快。"
- ↑ 维基百科:位图索引:压缩。 FIXME:用更好的引用替换此引用。
- ↑ a b "Pucrunch:一种优化混合 LZ77 RLE 数据压缩程序,也称为提高低资源解压缩的压缩率" 由 Pasi Ojala 撰写
- ↑ "解压缩 GZIP 压缩协议" 由 Joe Rash 撰写
- ↑ Matt Mahoney. "通用压缩基准"。进一步讨论:"通用压缩基准".
- ↑ IETF. "6LoWPAN 标头和类似标头的有效载荷的通用压缩"
- ↑ Christopher M. Sadler 和 Margaret Martonosi "延迟容忍网络中能量受限设备的数据压缩算法"