首页 / 数据压缩

数据压缩有效专利 发明

技术内容

数据压缩 背景技术 [0001] 本公开总体上涉及数据传输和存储领域,并且更具体地涉及数据压缩和解压缩。 [0002] 在数字系统中,可以压缩数据以节省存储成本或减少传输时间。可以压缩各种各样的数字数据信号(例如,数据文件、文档、图像等)。通过减少数据存储所需的内存和/或数据传输所需的时间,压缩能够提高系统性能并降低成本。 [0003] 一些众所周知且广泛使用的无损压缩方案采用基于字典的压缩,其利用以下事实:许多数据类型包含重复的字符序列。一种常规的算法LZ77通过用对未压缩数据流中较早存在的该数据的单个副本的引用来替换重复出现的数据而实现压缩。反复出现的数据(字符串匹配)通过称为长度‑距离对的一对数字来编码,该长度‑距离对等效于以下语句: “下一个长度字符中的每个等于未压缩流中紧随其后恰好距离字符的字符”。有时会将“距离”称为“偏移”。 [0004] 为了发现字符串匹配,编码器必须跟踪一定量的最新数据,例如最新的32kB数据。 保留该数据的结构称为滑动窗口。编码器使用该数据来搜索字符串匹配,并且解码器使用该数据来解释编码器所引用的匹配。滑动窗口越大,编码器搜索到创建引用的时间就越长。 [0005] 因此,为了实现压缩,编码器在滑动窗口中包含的数据中进行搜索,以找到与从输入流中的当前位置开始的字符串匹配的最长字符串。编码器对当前位置的某个数据单元以及输入流中一个或多个后续数据单元执行哈希函数,并使用所得的哈希作为进入哈希表的索引,该哈希表针对每个哈希包括一组指向历史缓冲区中产生相同哈希的其他字符串的指针。 [0006] LZ78算法通过用对基于输入数据流而建立的字典的引用来替换重复出现的数据而实现压缩。每个字典条目的形式为dictionary[...]={index,character},其中index是上一个字典条目的索引,字符附加到由dictionary[index]表示的字符串后面。例如,“abc”将(以相反的顺序)存储为:dictionary[k]={j,‘c’},dictionary[j]={i,‘b’},dictionary[i]={0,‘a’},其中索引0表示字符串的第一个字符。 [0007] 该算法初始化最后一个匹配索引=0,下一个可用索引=1。对于输入流的每个字符,在字典中搜索匹配:{最后一个匹配索引,字符}。如果找到匹配,则将最后一个匹配索引设置为匹配条目的索引,不输出任何内容。如果未找到字符串匹配,则创建一个新的字典条目:字典[下一个可用索引]={最后一个匹配索引,字符},并且算法输出最后一个匹配索引以及字符,然后重置最后一个匹配索引=0并递增下一个可用索引。 [0008] LZW是基于LZ78的算法,其使用以所有可能的字符(符号)预初始化的字典或预初始化字典的仿真。LZW的主要改进是,当未找到匹配时,假定当前输入流字符是字典中现有字符串的第一个字符(因为已使用所有可能的字符对字典进行了初始化),因此仅输出最后一个匹配索引(其可以是对应于上一个输入字符或初始输入字符的预初始化字典索引)。为了对LZW压缩的数据进行解码,解码器需要访问使用的初始字典。可以从先前的条目中重构其他条目。 [0009] 通常,基于字典的压缩方法使用用标识字典中的子字符串的代码字替换数据流中的子字符串的原则。如果已知输入流和统计信息,则此字典可以是静态的,或字典可以是适应性的。适应性的字典方案更适合处理统计信息未知或变化的数据流。 [0010] 基于常规字典的滑动窗口压缩技术中的每个都有缺点。例如,使用LZ78型字典(例如LZW)压缩某些数据类型可以是有益的;使用LZ77字符串匹配压缩其他数据类型可以更有效。 [0011] 而且,尽管较大的滑动窗口通常会产生更多更长的匹配,但在软件和硬件中,增加滑动窗口的大小可能在实现成本方面更加昂贵或降低性能。例如,滑动窗口可以存储在专用存储器中,例如与标准存储器相比需要更多电路来实现的内容可寻址存储器。 [0012] 另外,较大的滑动窗口可能会致使存储较小匹配的引用低效。此外,通常的基于字典的方案本质上是串行的,并且没有利用许多处理器体系结构中可用的并行处理,从而导致性能下降。 [0013] 在上述上下文中,已经出现了对本公开的需求。因此,需要解决常规系统和方法的前述缺点中的一个或多个,本公开满足了该需求。 发明内容 [0014] 可以在本公开的示例性实施例中找到用于扩充数据压缩方案的字典的方法的各个方面。 [0015] 在本公开的一个实施例中,针对每个输入字符串,将滑动窗口搜索的结果与字典搜索的结果进行比较。如果滑动窗口搜索结果长于字典搜索结果,则用滑动窗口搜索结果扩充字典。本公开的另一个实施例实现多个滑动窗口,每个滑动窗口具有相关联的大小,滑动窗口的大小取决于对应的匹配长度。对于一个实施例,每个滑动窗口具有基于匹配长度的对应的哈希函数。 [0016] 可以通过参考说明书的其余部分和附图来实现对本文的本公开的性质和优点的进一步理解。下面参照附图详细描述本公开的其他特征和优点以及本公开的各个实施例的结构和操作。在附图中,相同的附图标记表示相同或功能相似的元件。 附图说明 [0017] 图1示出了根据本公开的一个实施例的用于为滑动窗口压缩方案提供字典的过程; [0018] 图2示出了根据本公开的一个实施例的取决于匹配长度的多个滑动窗口压缩方案; [0019] 图3示出了根据本公开的一个实施例的取决于匹配长度的多个滑动窗口压缩方案;以及 [0020] 图4示出了根据本公开的各个实施例的可以用于执行过程的计算设备。 具体实施方式 [0021] 现在将详细参考本公开的实施例,其示例在附图中示出。尽管将结合实施例描述本公开,但是应当理解,它们并不旨在将本公开限制于这些实施例。相反,本公开旨在覆盖可以包括在由所附权利要求限定的本公开的精神和范围内的替代、修改和等同形式。此外,在本公开的以下详细描述中,阐述了许多具体细节以提供对本公开的透彻理解。然而,对于本领域的普通技术人员来说显而易见的是,可以在没有这些具体细节的情况下实践本公开。在其他情况下,没有详细描述公知的方法、步骤、组件和电路,以免不必要地使本公开的各方面不清楚。此外,发明方面在于少于单个公开实施例的所有特征。因此,具体实施方式后的权利要求在此明确地并入该具体实施方式中,每个权利要求独立地作为本公开的单独实施例。 [0022] 公开了用于改进的基于字典的压缩算法的系统和方法。本公开的实施例提供了一种用于字符串搜索和扩充数据压缩方案的字典的方法。针对每个输入字符串,将滑动窗口搜索的结果与字典搜索的结果进行比较。如果滑动窗口搜索结果长于字典搜索结果,则用滑动窗口搜索结果扩充字典。本公开的实施例实现多个滑动窗口,每个滑动窗口具有相关联的大小,滑动窗口的大小取决于对应的匹配长度。对于一个实施例,每个滑动窗口具有基于匹配长度的对应的哈希函数。 [0023] 本公开的实施例可应用于影响数据压缩或解压缩的各种设置中。 [0024] 匹配的字符串字典 [0025] 本公开的各种替代实施例提供了用于使用滑动窗口匹配长度搜索来确定字典条目而创建用于基于字典的压缩方案的字典的系统和方法。 [0026] 如上所述,LZ77压缩在滑动窗口上采用匹配字符串搜索,并且一旦确定了最长匹配,就使用长度‑距离对对匹配进行编码。由于通常的滑动窗口大小为32KB,因此最小匹配长度通常设置为三字节,以通过编码为(长度,距离)对来实现压缩。在LZ77压缩期间,最近匹配的字符串可能会反复出现。将这种反复出现的字符串压缩为字典条目而不是多个(长度,距离)对更为有效。因此,包括最近匹配的字符串的字典可以提供更高的压缩效率,因为将匹配字符串编码为(字典指示符,字典索引)匹配字符串可能更短。这是因为,当经常使用字典来确定匹配字符串时,指示符通过熵编码(例如,霍夫曼编码)以较短的长度表示。此外,采用包括最近匹配的字符串的字典可以使确定最长匹配更快。此外,扩充的字典使得能够在滑动窗口之外进行字符串匹配搜索。 [0027] 图1示出了根据本公开的一个实施例的用于为滑动窗口压缩方案提供字典的过程。 [0028] 如图1所示,过程100在操作102处开始,在操作102中,接收数据字符串。在操作104处,如上面关于LZ77压缩算法所讨论的,在滑动窗口(通常为32KB)上执行搜索,并且确定最长匹配字符串长度。在操作106处,执行字典搜索以确定最长字典匹配的长度。在操作108处,将匹配的字符串长度与字典匹配的长度进行比较。 [0029] 在操作109处,如果匹配的字符串长度大于字典匹配长度,则执行操作110,将引用匹配字符串的字典条目添加到字典。对于本公开的各个实施例,根据常规的基于字典的压缩方案过程来将匹配的字符串添加到字典。如果匹配的字符串长度不大于字典匹配长度,则执行操作111,将输入数据字符串编码为匹配中字典条目,并使用后续的输入数据字符串重复该过程。 [0030] 根据本公开的一个方面,仅当匹配的字符串长于字典匹配时,才将该匹配的字符串添加到字典中。因此,字典仅包括匹配的字符串。与现有技术的为字典中尚不存在的任何字符串创建字典条目的基于字典的压缩方法相比,本公开的实施例仅在通过滑动窗口字符串匹配搜索将字符串识别为最长匹配时才创建字典条目。这可以使压缩更快更有效。在解压缩时,解码器通过基于匹配结果创建字典条目来重复编码器的字典构建过程,并因此重新创建用于压缩的相同字典。 [0031] 多个取决于匹配长度的滑动窗口 [0032] 如上所述,诸如LZ77的滑动窗口压缩方案实现单个滑动窗口以跟踪固定量的最新数据流输入。滑动窗口的大小可以是例如2KB、4KB或32KB。较小的滑动窗口大小允许高效地编码较小的匹配,而较大的滑动窗口大小通常导致更长的匹配。一些基于LZ77的算法(例如DEFLATE和GZIP)使用32KB滑动窗口。这种算法需要23位才能将匹配编码为(偏移,长度)对,其中15位用于偏移,8位用于长度。因此,对于32KB的滑动窗口,对少于三字节的匹配进行编码是徒劳的。增大滑动窗口的大小以增加识别更长的匹配的可能性将致使甚至更长的匹配(例如3字节匹配)的编码低效。 [0033] 例如,考虑由Hi表示的i个逐字节字符的哈希函数,一个32KB的滑动窗口压缩方案将具有3字节的最小匹配长度,因此将使用哈希函数H3。如果数据流包括一个在偏移为16KB处长度为4字节的匹配和一个在偏移为48KB(即在滑动窗口之外)处长度为12字节的匹配,则识别出的最长匹配将是在偏移16KB处的4字节的匹配。如果增加滑动窗口大小以定位更长的匹配,则最小有效匹配长度会增加。 [0034] 本公开的实施例可以实现多个不同大小的滑动窗口,滑动窗口的大小基于匹配长度。本公开的实施例还可以为实现的每个滑动窗口大小创建对应的哈希函数。 [0035] 本公开的实施例包括致使可对匹配长度进行有效地压缩的滑动窗口大小和匹配长度的所有组合。对于一个实施例,实现七个滑动窗口大小,每个滑动窗口大小具有对应的匹配长度。匹配对是长度‑偏移的形式,因此,在解压缩时,解码器采用对应的取决于长度的滑动窗口。 [0036] 图2示出了根据本公开的一个实施例的取决于匹配长度的多个滑动窗口压缩方案。 [0037] 如图2所示,2字节的匹配长度具有对应于5位的滑动窗口大小;3字节的匹配长度具有对应于9位的滑动窗口大小;4字节的匹配长度具有对应于12位的滑动窗口大小;5字节的匹配长度具有对应于15位的滑动窗口大小;6字节的匹配长度具有对应于17位的滑动窗口大小;7字节的匹配长度具有对应于19位的滑动窗口大小;8或更多字节的匹配长度为具有对应于20位的滑动窗口大小。因此,通过基于匹配长度限制滑动窗口大小,可对各种大小的匹配中的每个进行有效地压缩。例如,当使用对应于5位的滑动窗口大小时,可对2字节的匹配进行压缩。 [0038] 与常规的单个滑动窗口方案相比,根据本公开的各个实施例的取决于匹配长度的多个滑动窗口方案实质上改善了压缩性能。根据本公开的各个实施例,可以通过实现多个哈希函数方案来提高压缩速度。 [0039] 为了避免不必要的搜索,对于本公开的替代实施例,可以实现针对多个滑动窗口大小中的每个的哈希链。对于一个这样的实施例,对应的哈希函数中的每个采用与特定窗口大小相关联的字符的最小匹配长度的输入。例如,如图2所示,一个2字节的匹配采用哈希函数H3,而一个8字节或更大字节的匹配采用H8。因此,对于这样的实施例,仅在H8哈希链上搜索最长匹配,并且第一个完全匹配满足其他哈希链的需要。 [0040] 并行处理 [0041] 根据本公开的各个实施例的多个滑动窗口大小‑多个哈希函数方案适合多核环境,因为每个哈希链搜索可以独立地并且并行地执行。由于匹配长度与滑动窗口大小成正比,因此几个哈希链中的每个的长度都是可比较的,因此适合并行处理。例如,可以分配一个核来确定20位滑动窗口在H8哈希链上的最长匹配。可以分配另一个核来确定19位滑动窗口在H7哈希链上的最长匹配。可以分配另一个核来确定18位滑动窗口在H6哈希链上的最长匹配。可以分配另一个核来确定15位滑动窗口在H5哈希链上的最长匹配。可以分配另一个核来确定12位滑动窗口在H4哈希链上的最长匹配。可以分配另一个核来确定9位滑动窗口在H3哈希链上的最长匹配。并且可以分配另一个核来确定5位滑动窗口在H2哈希链上的最长匹配。根据本公开的实施例的多个并行搜索通过减少确定最长匹配的时间而使压缩更快。 此外,如上所述,由于H2哈希链具有对应于5位的滑动窗口大小,因此可对完全的两字节匹配进行压缩。因此,与在没有多个对应大小滑动窗口的情况下实现多哈希的现有技术方案相比,本公开的实施例提供了更高效的压缩。 [0042] 顺序处理 [0043] 如果搜索是顺序进行的,则搜索遵循哈希字节的降序,直到确定成功匹配为止。例如,参考图2的实现,搜索开始于确定20位滑动窗口在H8哈希链上的最长匹配;如果成功则终止搜索,否则针对19位滑动窗口在H7哈希链上继续搜索以确定第一个完全的7字节匹配,该过程在每个哈希链/滑动窗口大小组合上继续,直到确定匹配为止。 [0044] 在本公开的替代实施例中,取决于匹配长度的压缩方案将单个哈希函数大小用于多个滑动窗口大小。 [0045] 图3示出了根据本公开的一个实施例的对应于滑动窗口大小的匹配长度大小和哈希函数大小。 [0046] 在图3中,2字节的哈希函数大小用于2字节的匹配长度,2字节的匹配长度具有取决于该匹配长度的5位的滑动窗口大小。2字节的哈希函数大小也用于3字节的匹配长度,3字节的匹配长度具有取决于该匹配长度的9位的滑动窗口大小。如图3所示,其他哈希函数也用于多个匹配长度/滑动窗口大小组合。这允许在适当的情况下减少哈希函数的数量。如图3所示,对于这样的实施例,哈希函数的大小等于最小匹配长度。 [0047] 已经将本公开的实施例描述为包括各个操作。以其最基本的形式描述了许多过程,但是在不脱离本公开的范围的情况下可以将操作添加到任何过程中或从任何过程中删除操作。例如,根据本公开的各个实施例的字典匹配算法可以结合取决于匹配长度的多个滑动窗口方案来实现,或者可以独立于另一个来实现。 [0048] 根据本公开的实施例可以体现为装置、方法或计算机程序产品。因此,本公开可以采取以下形式:完全硬件实施例、完全软件实施例(包括固件、驻留软件、微代码等),或结合了软件和硬件方面的实施例,这些实施例在本文中通常都可以被称为“模块”或“系统”。此外,本公开可以采取以下形式:在任何有形的表达介质中体现的计算机程序产品,该有形的表达介质具有在其中体现的计算机可用程序代码。 [0049] 可以使用一种或多种计算机可用或计算机可读介质的任何组合,包括非暂时性介质。例如,计算机可读介质可以包括硬盘、随机存取存储器(RAM)设备、只读存储器(ROM)设备、可擦可编程只读存储器(EPROM或闪存)设备、便携式光盘只读存储器(CDROM)、光学存储设备和磁性存储设备中的一个或多个。在选定的实施例中,计算机可读介质可以包括任何非暂时性介质,该非暂时性介质能够包含、存储、通信、传播或传输由指令执行系统、装置或设备使用或与其结合使用的程序。 [0050] 可以以一种或多种编程语言的任意组合来编写用于执行本公开的操作的计算机程序代码,所述编程语言包括诸如Java、Smalltalk、C++之类的面向对象的编程语言以及诸如“C”编程语言或类似的编程语言的常规的过程编程语言。程序代码可以完全在计算机系统上作为独立软件包执行,在独立硬件单元上执行,部分在与计算机有一定距离的远程计算机上执行,或者完全在远程计算机或服务器上执行。在后一种情况下,远程计算机可以通过任何类型的网络(包括局域网(LAN)或广域网(WAN))连接到计算机,或者可以与外部计算机建立连接(例如,通过使用互联网服务提供商的互联网)。 [0051] 下面可以参考根据本公开的实施例的方法、装置(系统)和计算机程序产品的流程图图示和/或框图来描述本公开。将理解的是,流程图图示和/或框图的每个框以及流程图图示和/或框图中的框的组合可以通过计算机程序指令或代码来实现。可以将这些计算机程序指令提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器以生产机器,从而使得经由计算机的处理器或其他可编程数据处理装置执行的指令创建用于实现流程图和/或框图单个框或多个框中指定的功能/动作的装置。 [0052] 这些计算机程序指令也可以存储在非暂时性计算机可读介质中,该介质可以指导计算机或其他可编程数据处理装置以特定方式运行,从而使存储在计算机可读介质中的指令生产一种包括指令装置的制品,该指令装置实现流程图和/或框图单个框或多个框中指定的功能/动作。 [0053] 计算机程序指令还可以被加载到计算机或其他可编程数据处理装置上,以使得在计算机或其他可编程装置上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机或其他可编程装置上执行的指令提供用于实现流程图和/或框图单个框或多个框中指定的功能/动作的过程。 [0054] 图4示出了根据本公开的各个实施例的可用于执行过程的计算设备400。计算设备 400可以用作服务器、客户端或任何其他计算实体。计算设备400可以是能够执行本文描述的功能的任何类型的计算设备,所述功能包括压缩数据、解压缩数据、读取数据、写入数据、发送数据以及执行过程。如图4所示,计算设备400包括中央处理单元(CPU)402、主存储器 404、输入/输出(I/O)子系统406、通信电路408以及一个或多个数据存储设备412。在其他实施例中,计算设备可以包括其他或附加组件,例如计算机中常见的那些组件(例如,显示器、外围设备等)。另外,在一些实施例中,说明性组件中的一个或多个可以并入另一组件中,或者以其他方式形成另一组件的一部分。例如,在一些实施例中,主存储器404或其部分可以并入CPU 402中。 [0055] CPU 402可以体现为能够执行本文描述功能的任何类型的处理器。这样,CPU 402可以体现为单核或多核处理器、微控制器或其他处理器或处理/控制电路。在一些实施例中,CPU 402可以体现为、包括、或联接到现场可编程门阵列(FPGA)、专用集成电路(ASIC)、可重新配置的硬件或硬件电路或其他专用硬件,以促进本文描述的功能的性能。CPU 402可以包括专用压缩逻辑420,其可以体现为能够从CPU 402的其他组件上卸载数据压缩的任何电路或设备,例如FPGA、ASIC或协同处理器。主存储器404可以体现为能够执行本文描述功能的任何类型的易失性(例如,动态随机存取存储器(DRAM)等)或非易失性存储器或数据存储器。在一些实施例中,主存储器404的全部或一部分可以被集成到CPU 402中。在操作中,主存储器404可以存储在操作期间使用的各种软件和数据,例如未压缩的输入数据、哈希表数据、压缩的输出数据、操作系统、应用程序、程序、库和驱动程序。I/O子系统406可以体现为电路和/或组件,以促进与CPU 402、主存储器404和计算设备400的其他组件的输入/输出操作。例如,I/O子系统406可以体现为、或以其他方式包括内存控制器集线器、输入/输出控制集线器、集成传感器集线器、固件设备、通信链接(例如,点对点链接、总线链接、电线、电缆、光导、印刷电路板轨迹等)和/或其他组件和子系统,以促进输入/输出操作。在一些实施例中,I/O子系统406可以形成片上系统(SoC)的一部分,并且与CPU 402、主存储器404和计算设备400的其他组件中的一个或多个一起合并在单个集成电路芯片上。 [0056] 通信电路408可以体现为使通信能够在计算设备400和另一计算设备之间的网络上进行的任何通信电路、设备或其集合。通信电路408可以配置为使用任何一种或多种通信技术(例如,有线或无线通信)和相关协议(例如,以太网、蓝牙、RTM、Wi‑Fi、WiMAX等)来影响这种通信。 [0057] 说明性的通信电路408包括网络接口控制器(NIC)410,其可以体现为一个或多个附加板、子卡、网络接口卡、控制器芯片、芯片组或可以由计算设备400使用以与另一个计算设备连接的其他设备。在一些实施例中,NIC 410可实现为包括一个或多个处理器的片上系统(SoC)的一部分,或者包括在也包含一个或多个处理器的多芯片封装中。在一些实施例中,NIC 410可以包括在NIC 410本地的处理器(未示出)。在这样的实施例中,NIC 410的本地处理器可能够执行本文描述的CPU 402的一个或多个功能。 [0058] 数据存储设备412可以体现为配置用于短期或长期数据存储的任何类型的设备,例如固态驱动器(SSD)、硬盘驱动器、存储卡、和/或其他存储设备和电路。每个数据存储设备412可以包括存储用于数据存储设备412的数据和固件代码的系统分区。每个数据存储设备412还可以包括存储用于操作系统的数据文件和可执行文件的操作系统分区。在说明性实施例中,每个数据存储设备412包括非易失性存储器。非易失性存储器可以体现为能够以持久的方式存储数据的任何类型的数据存储器(即使非易失性存储器断电)。例如,在说明性实施例中,非易失性存储器实现为闪存(例如,NAND存储器或NOR存储器)或以上任何者的组合或其他存储器。另外,计算设备400可以包括一个或多个外围设备414。这样的外围设备 414可以包括在计算设备中常见的任何类型的外围设备,例如显示器、扬声器、鼠标、键盘和/或其他输入/输出设备,接口设备和/或其他外围设备。 [0059] 尽管以上是对本公开的示例性特定实施例的完整描述,但是其他实施例也是可能的。因此,以上描述不应被视为限制本公开的范围,本公开的范围由所附权利要求及其等同物的全部范围限定。 [0060] 以下附录(字典匹配伪代码)包含伪代码和相关描述,这些伪代码和相关描述形成了该具体实施方式的组成部分,并且通过引用将其整体并入本文。该附录包含在一些实施例中执行的上述动作的说明性实现。请注意,以下伪代码不是用任何特定的计算机编程语言编写的。相反,伪代码为技术人员提供了足够的信息,以将伪代码转换为适合于编译为目标代码的源代码。 [0061] 附录 [0062] (字典匹配伪代码) [0063] [0064] [0065] [0066] [0067]