文本文件中的数据顺序是不是会影响其压缩率?
Posted
技术标签:
【中文标题】文本文件中的数据顺序是不是会影响其压缩率?【英文标题】:Does the order of data in a text file affects its compression ratio?文本文件中的数据顺序是否会影响其压缩率? 【发布时间】:2013-02-14 18:11:27 【问题描述】:我有 2 个大文本文件(准确地说是 csv)。两者具有完全相同的内容,只是一个文件中的行顺序相同,而另一个文件中的行顺序不同。
当我压缩这 2 个文件(以编程方式,使用 DotNetZip)时,我注意到其中一个文件总是相当大 - 例如,一个文件比另一个文件大约 7 MB。-
我的问题是:
文本文件中的数据顺序如何影响压缩以及可以采取哪些措施来保证最佳压缩率? - 我认为将相似的行分组在一起(至少在 ZIP 文件的情况下,这是我正在使用的)将有助于压缩,但我不熟悉不同压缩算法的内部结构,我会很感激快速解释关于这个问题。
哪种算法可以更好地处理这种情况,无论数据的顺序如何,都能实现最佳的平均压缩?
【问题讨论】:
【参考方案1】:“如何”已经得到回答。要回答您的“哪个”问题:
匹配的窗口越大,算法对订单的敏感度就越低。然而,所有的压缩算法都会在某种程度上敏感。
gzip 有一个 32K 的窗口,bzip2 有一个 900K 的窗口,而 xz 有一个 8MB 的窗口。 xz 可以达到 64MB 的窗口。所以 xz 对订单最不敏感。更远的匹配将花费更多位进行编码,因此无论窗口大小如何,您总是可以通过排序记录获得更好的压缩。短窗口只会排除远距离匹配。
【讨论】:
+1:这是很好的信息。你的名字似乎“可疑地”熟悉。你是 zlib Adler 吗? 非常酷。感谢您在该库上所做的工作。太棒了。【参考方案2】:在某种意义上,它是文件的entropy 的度量,它定义了它的压缩程度。所以,是的,顺序绝对重要。举个简单的例子,考虑一个填充了值abcdefgh...zabcd...z
的文件,一遍又一遍地重复。大多数算法都可以很好地压缩它,因为它非常有序。但是,如果您完全随机化顺序(但每个字母的计数相同),那么它具有完全相同的数据(尽管“含义”不同)。是相同的数据,顺序不同,也不会压缩。
事实上,因为我很好奇,所以我只是尝试了一下。我用 100,000 个字符 a-z
重复填充了一个数组,将其写入文件,然后“随机”打乱该数组并再次写入。第一个文件压缩到 394 字节(小于原始大小的 1%)。第二个文件压缩到 63,582 字节(超过原始大小的 63%)。
【讨论】:
谢谢。有没有你知道的算法,在数据打乱的场景中效率更高? 我不确定。我真正玩过的唯一一个是 zlib(我认为它类似于旧 pkzip 时代的 deflate 算法......我认为)。我的猜测是,通用算法通常会受到“洗牌”数据的大致相同的影响。我怀疑它需要一个高度特定的算法来识别某些情况。例如,如果您事先知道您的数据会以某种方式被打乱,您可以在压缩/压缩它之前对其进行预处理。解压后进行后期处理。 在您的示例中,假设字符 a-z 出现的数量相等,但顺序随机,您需要 5 位而不是 8 位来编码接下来出现的字符。 (实际上,您有 26 个字符,5 位足以编码 32 个不同的值。)因此,对于 100000 个字符,您需要 100000 * 5 / 8 = 62500 个字节。您的 63582 字节文件可能就是这样,加上一些元数据和一个表,以指示每个 5 位值表示什么字符。更多详情,请查阅“霍夫曼编码”。【参考方案3】:典型的压缩算法工作如下。看一大块数据。如果它与其他最近看到的块相同,请不要按字面意思输出当前块,而是输出对那个较早块的引用。
当相似的块靠得很近时,它肯定会有所帮助。该算法将仅保留有限数量的回溯数据以保持合理的压缩速度。因此,即使一个数据块与其他数据块相同,如果该旧数据块太旧,它可能已经被刷新掉了。
【讨论】:
【参考方案4】:当然可以。如果输入模式是固定的,则有 100% 的机会预测每个位置的字符。鉴于两方都知道他们的数据流(这基本上等于说他们知道固定模式),几乎不需要传达任何内容:完全压缩是可能的(传达有限长度的字符串,而不是无限的流,你' d 仍然需要对长度进行编码,但这有点离题了)。如果对方不知道该模式,您需要做的就是对其进行编码。完全压缩是可能的,因为您可以用有限的数据量编码无限的流。
在另一个极端,如果你有完全随机的数据——所以流可以是任何东西,下一个字符总是可以是任何有效字符——就不可能进行压缩。流必须完整地传输,对方才能重建正确的流。
有限字符串有点棘手。由于有限字符串必须包含每个字符的固定数量的实例,因此一旦您开始读取初始标记,概率就必须改变。可以将 some 一种顺序读入任何有限字符串。
不确定这是否回答了您的问题,但它从理论上解决了一些问题。
【讨论】:
以上是关于文本文件中的数据顺序是不是会影响其压缩率?的主要内容,如果未能解决你的问题,请参考以下文章