Too young, too simple. Sometimes, naive & stupid

重复数据删除和数据压缩之间的确切区别

重复数据删除可以被视为一种高度专门的压缩形式,针对特定的上下文。接下来的长的答案。在对比这些技术之前,让我们来谈谈一些典型的压缩方式。压缩压缩本身是非常多样的。您有有损压缩算法,例如JPEG和MP3,它们使用我们看到或听到的模型来丢弃一些可能对图像或声音不重要的信息,但仍降低了质量。根据您的问题,这些技术大都不在此问题的范围之内。您可能主要关心的是我们所说的通用无损算法,如zip,LZMA,LZ4等,可以以可逆的方式压缩任意文件。通常这些压缩文件至少使用以下非详尽列表中的几种技术:匹配查找 在(重复字节串)中找到冗余,并用较短的序列替换重复。例如,这样的算法可能具有字符串:developers developers developers developers然后用以下代码替换:developers (0,11)(0,22)其中(0,11)表示“从位置0开始重新使用11个字符”。这被称为“匹配发现”或LZ77风格的压缩,是直截了当的。熵编码。您可以从以下字符串开始:AABCABBCABACBAAACBCCAABAAACBAA这看起来很随机,对吧?但是,您可能会注意到,某些字母比其他字母更多出现 - A出现在B和C两倍左右,其他字母根本不会出现!使用该信息,可以选择表示与更少的信息,例如,该串中的字符的编码,A可以使用二进制编码0,而B和C被指派1011分别。如果你最初每个字符使用8位,这是一个很大的节省。造型大多数数据具有复杂的关系,这些关系不一定很好地被上面简单的技术压缩,而是需要一些类型的模型。例如,您可能有各种模型可以根据相邻像素预测图像中像素的值。您可能有一个模型,根据该句子预测句子中最可能的下一个单词。例如,如果我说:Who let the dogs ___你可能能够高精度地填写空白。这些都不是相互排斥的 - 它们通常以互补的方式使用,并且还有以上没有提及的附加技术。现在,在讨论重复数据删除之前,确切地说,值得注意的是压缩算法的典型特征。这些不是绝对的规则,而是许多压缩算法的常见特征,除非它们被专门设计来避免它们:输入字节和输出字节之间没有简单的关系。输入和输出以复杂的方式相关(不同的是,Base-64编码,其中每3个连续输入字节按顺序对应到4个连续的输出字节)。其含义如下:您经常不能简单地获取压缩数据并解压缩其任意部分,例如“解压缩此文件的最后500个字节”。您可能需要从头开始读取整个压缩文件,或至少从流中的一些着名点开始。未压缩输入的修改可能对压缩输出有任意大的影响。例如,更改输入中的单字节可能会改变输出中的每个后续字节。这通常意味着很难逐渐更新大型压缩流(即,基于对输入的修改)。重复数据删除所以考虑到上述压缩的定义和讨论,重复数据删除通常意味着什么?今天,您通常会在存储设备或体系结构比赛中介绍重复数据删除技术。例如,当存在大量重复数据时,这是一种节省磁盘空间的方法(例如,在SAN上有100个VM映像 - 操作系统和其他常见的可能会有很多重复每个虚拟机上的文件)。重复数据删除是将这种冗余数据仅存储一次的一种方法。实质上,它实现了大规模的上述技术(1),没有上面讨论的一些限制。因此,它只是一种压缩形式,可在大块区域,跨整个驱动器或整个存储主机,甚至跨网络机器集群上运行。现在,您不能只是“gzip”整个驱动器,因为重复数据删除应该是透明的,功能上和性能方面的。文件系统提供的API(例如POSIX或Win32等)允许用户写入文件的任意部分。如果用户修改1GB文件中的1个字节,如果这需要一分钟或更长时间解压缩然后压缩整个文件,那么它们会感到惊讶。因此,重复数据删除工作方式是可以随意访问文件,例如,通过具有使得任何字节的位置可以被定位的索引)。这通常意味着重复数据删除仅适用于大型匹配(块)大小,否则跟踪块的成本变得令人望而却步。一些系统只能检测到符合其他条件的重复,如在文件中具有相同的对齐方式。重复数据消除通常会透明地发生(文件系统的用户不知道),也可能会异步发生:即,当新数据写入时,它首先被视为唯一的,只有稍后才能检查重复数据,并可能与现有数据合并。简而言之,重复数据删除可以被认为是一种类型的压缩的特定应用,调整到将要用于的域中:去除典型压缩算法的一些限制,以换取可接受的性能,但是以牺牲大的重复区域为代价,并且通常避免其他压缩机会,例如 熵编码 或 建模。