压缩文件多少次?

时间:2009-07-22 16:08:17

标签: compression limits

我正在考虑压缩,似乎必须对可以应用于它的压缩进行某种限制,否则它将是单个字节。

所以我的问题是,我之前可以压缩文件多少次:

  • 它没有变小?
  • 文件损坏了吗?

这两点是相同还是不同?

收益递减点在哪里出现?

如何找到这些要点?

我不是在谈论任何特定的算法或特定文件,只是一般。

15 个答案:

答案 0 :(得分:64)

对于无损压缩,通过重新压缩文件可以知道可以获得多少次的唯一方法是尝试。它将取决于压缩算法和您正在压缩的文件。

两个文件永远不能压缩到相同的输出,所以你不能下到一个字节。一个字节如何表示您可以解压缩到的所有文件?

第二次压缩有时会起作用的原因是压缩算法无法进行全面的完美压缩。它必须做的工作与完成工作所需的时间之间存在权衡。您的文件正在从所有数据更改为有关数据和数据本身的数据组合。

示例

以游程编码(可能是最简单有用的压缩)为例。

04 04 04 04 43 43 43 43 51 52 11个字节

这一系列字节可以压缩为:

[4] 04 [4] 43 [-2] 51 52 7个字节(我将元数据放在括号中)

括号中的正数是重复计数,括号中的负数是发出下一个-n字符的命令。

在这种情况下,我们可以尝试再压缩一次:

[3] 04 [-4] 43 fe 51 52 7个字节(fe是你的-2看作是两个补码数据)

我们一无所获,我们将在下一次迭代中开始成长:

[ - 7] 03 04 fc 43 fe 51 52 8字节

我们每次迭代会增长一个字节一段时间,但实际上会变得更糟。一个字节只能将负数保持为-128。当文件长度超过128个字节时,我们将开始增长两个字节。随着文件变大,增长将变得更糟。

对压缩程序有一个逆风 - 元数据。而且,对于真正的压缩器,标题会添加到文件的开头。这意味着最终文件将在每次额外压缩时开始增长。


RLE是一个起点。如果您想了解更多信息,请查看LZ77(查看文件以查找模式)和LZ78(构建字典)。像zip这样的压缩器经常尝试多种算法并使用最好的算法。

在某些情况下,我可以想到多个压缩的工作原理。

  1. 我在一张装有磁盘的Amiga杂志上工作。当然,我们把磁盘装到鳃上。我们使用的工具之一允许您打包可执行文件,以便在运行时,它可以解压缩并自行运行。因为解压缩算法必须在每个可执行文件中,所以它必须小而简单。我们经常通过压缩两次得到额外的收益。解压缩在RAM中完成。由于读取软盘的速度很慢,我们的速度也经常提高!
  2. Microsoft支持bmp文件上的RLE压缩。此外,许多文字处理器都进行了RLE编码。 RLE文件几乎总是可以被更好的压缩器压缩。
  3. 我参与的很多游戏都使用了一个小巧,快速的LZ77解压缩器。如果压缩一个大的矩形像素(特别是如果它有很多背景颜色,或者它是一个动画),你可以经常压缩两次,效果很好。 (原因?你只有很多位来指定回溯距离和长度,所以一个大的重复模式被编码成几个部分,而那些部分是高度可压缩的。)

答案 1 :(得分:17)

通常,限制是一次压缩。一些算法导致更高的压缩比,并且使用差的算法,然后使用良好的算法通常会导致改进。但是首先使用好的算法是正确的做法。

理论上限制了一组给定数据的压缩程度。要了解有关此内容的更多信息,您必须学习information theory

答案 2 :(得分:14)

一般情况下,对于大多数算法,压缩不止一次都没有用。但是有一个特例。

如果您有大量重复文件,zip格式将分别独立压缩,然后您可以压缩第一个zip文件以删除重复的zip信息。具体来说,对于7个大小为108kb的相同Excel文件,使用7-zip压缩它们会产生120kb的存档。再次压缩导致18kb存档。过去你会收益递减。

答案 3 :(得分:7)

假设我们有一个N位长的文件,我们想要无损压缩它,以便我们可以恢复原始文件。有2 ^ N个可能的文件N位长,因此我们的压缩算法必须将这些文件中的一个更改为2 ^ N个可能的其中一个。但是,我们不能在少于N位的情况下表达2 ^ N个不同的文件。

因此,如果我们可以获取一些文件并压缩它们,我们必须有一些长度处于压缩状态的文件,以平衡那些缩短的文件。

这意味着压缩算法只能压缩某些文件,实际上它必须延长一些文件。这意味着,平均而言,压缩随机文件不能缩短它,但可能会延长它。

实用压缩算法有效,因为我们通常不使用随机文件。我们使用的大多数文件都有某种结构或其他属性,无论它们是文本还是程序可执行文件还是有意义的图像。通过使用良好的压缩算法,我们可以大大缩短我们通常使用的类型的文件。

但是,压缩文件不是这些类型之一。如果压缩算法很好,大部分结构和冗余都被挤掉了,剩下的就像随机性一样。

正如我们所见,没有压缩算法可以有效地压缩随机文件,这也适用于随机文件。因此,尝试重新压缩压缩文件不会显着缩短它,并且可能会将其延长一些。

因此,压缩算法可以有效运行的正常次数是一次。

腐败只发生在我们谈论有损压缩时。例如,您无法从JPEG文件中精确恢复图像。这意味着JPEG压缩器可以可靠地缩短图像文件,但这样做的代价是无法完全恢复它。我们经常愿意为图像而不是文本,特别是不是可执行文件。

在这种情况下,没有腐败开始的阶段。它会在您开始压缩它时开始,并在您压缩它时变得更糟。这就是为什么优秀的图像处理程序可以让您指定制作JPEG时所需的压缩程度:这样您就可以平衡图像质量与文件大小。您可以通过考虑文件大小的成本来找到停止点(对于网络连接而言,这通常比存储更重要)与降低质量的成本。没有明显的正确答案。

答案 4 :(得分:5)

如果算法很好,通常压缩一次就足够了 事实上,多次压缩可能会导致尺寸增加

你的两点不同。

  • 反复进行压缩并实现尺寸减小没有改善
    是一个预期的理论条件
  • 重复压缩导致损坏
    可能是实现中的错误(或者算法本身)

现在让我们看一些例外或变体,

  • 加密可能重复应用而不会缩小尺寸
    (实际上有时会增加规模)以提高安全性
  • 图像,视频或音频文件越来越受压缩 会丢失数据(在某种意义上实际上是'损坏')

答案 5 :(得分:3)

您可以根据需要多次压缩文件。但对于大多数压缩算法而言,第二次产生的压缩可以忽略不计。

答案 6 :(得分:3)

  

在文件没有变小之前,我可以压缩多少次?

一般来说,甚至不是一个。无论您使用何种压缩算法,都必须始终存在一个根本不会被压缩的文件,否则您可以始终重复压缩,直到达到1个字节为止,通过相同的参数。

  

在文件损坏之前我可以压缩多少次?

如果用于压缩文件的程序完成其工作,该文件将永远不会损坏(当然我正在考虑无损压缩)。

答案 7 :(得分:3)

压缩(我想无损)基本上意味着更简洁地表达一些东西。例如

111111111111111

可以更明确地表达为

15 X '1'

这称为行程编码。计算机可以使用的另一种方法是找到在文件中定期重复的模式。

显然可以使用这些技术的数量有限,例如游程编码不会对

产生影响
15 X '1'

因为没有重复的模式。类似地,如果模式替换方法将长模式转换为3个char模式,则重新应用它将几乎没有效果,因为仅剩下的重复模式将是3个长度或更短。通常,对已经压缩的文件应用压缩会使其略大,因为各种开销。对压缩不良的文件应用良好的压缩通常不如仅应用良好的压缩效果好。

答案 8 :(得分:2)

你可以压缩无限次。但是,第二次和进一步的压缩通常只会产生比前一次更大的文件。所以压缩不止一次是没有意义的。

答案 9 :(得分:2)

这是终极压缩算法(在Python中),通过重复使用将压缩任何数字字符串缩小到0(它作为练习留给读者如何将其应用于字节串)。


def compress(digitString):
    if digitString=="":
        raise "already as small as possible"
    currentLen=len(digitString)
    if digitString=="0"*currentLen:
        return "9"*(currentLen-1)
    n=str(long(digitString)-1); #convert to number and decrement
    newLen=len(n);
    return ("0"*(currentLen-newLen))+n; # add zeros to keep same length

#test it
x="12";
while not x=="":
    print x;
    x=compress(x)

程序输出12 11 10 09 08 07 06 05 04 03 02 01 00 9 8 7 6 5 4 3 2 1 0然后空字符串。它不会在每次传递时压缩字符串,但会有足够的传递将任何数字字符串压缩到零长度字符串。确保记下通过压缩机发送的次数,否则你将无法取回它。

答案 10 :(得分:2)

这是一个非常好的问题。您可以从不同的角度查看文件。也许你先前知道这个文件包含算术系列。 让它作为“bytes”,“symbols”或“samples”的数据流来查看。

有些答案可以给你“信息论”和“数理统计” 请查看该研究人员的专题文章,以获得全面深入的理解:

A. Kolmogorov

S. Kullback

С. Shannon

N. Wiener

信息理论的主要概念之一是entropy。 如果你有一个“字节”流....那个字节的熵不依赖于你的“字节”或“样本”的值...... 如果仅由字节用于检索不同值的频率来定义。 最大熵可用于完全随机数据流。 当你的“字节”具有相同的值时,最小熵等于零。

  

它没有变小?

因此,熵是每个“字节”的最小位数,在将信息写入磁盘时需要使用该位。当然如果你使用上帝的算法就是如此。现实生活中的压缩无损启发式算法并非如此。

  

文件损坏了吗?

我不明白这个问题的意义。您可以不向磁盘写入任何位,并将损坏的文件写入磁盘,大小等于0位。当然它已损坏,但他的大小是零位。

答案 11 :(得分:1)

我想说明一下,压缩极限本身并没有真正适应最大极限。由于每种像素或书面语言都是黑色或写轮廓。人们可以编写一个程序,可以完美地将其反编译为书本上的内容,但是可以将像素模式和单词压缩为更好的压缩系统。含义压缩可能需要更长的时间,但是随着系统文件获得大量演出或terra字节,P和R和q的重复字母以及黑白偏差可能会被压缩成复杂的自动公式。 mhcien不需要有意义的数据,它可以使游戏制作出高度压缩的图案。然后,这又使我们可以创建定制的压缩阅读引擎。意味着现在我们有了真正的压缩能力。设计一个可以在用户端还原信息的整个引擎。该引擎拥有自己的最佳语言,没有空格,只能填充最小集的黑白像素盒,甚至可以编写自己的模式语言。因此,Nad可以同时实现最佳性能,当其关闭时可以给出唯一的密码或解压缩公式,从而可以对文件进行最佳压缩,并具有引擎以后用来解压缩的唯一密码。机器可以尽最大可能的迭代来进一步压缩文件。就像拥有一本打开的书并将当前所有关于人类的书面故事都放在一张A4纸上一样。我不知道,但这是另一种理论。因此,发生的事情是拆分卷,因为解压缩的公式将具有其自己的大小,而无法对文件夹进行命名,或者图标信息具有一定的大小,因此可以进一步将每种形式的数据放入一串信息中。嗯..

答案 12 :(得分:0)

使用“双表或交叉矩阵”的更高级压缩技术的示例 在算法中也消除了极端的unnessacry符号

[上一个例子] 以运行长度编码(可能是最简单的有用压缩)为例。

04 04 04 04 43 43 43 43 51 52 11 bytes

这一系列字节可以压缩为:

[4] 04 [4] 43 [-2] 51 52 7字节(我将元数据放在括号中)

[TURNS INTO] 04.43.51.52价值观 4.4。** - 2压缩

使用Additonal Symbols作为替代值进一步压缩

04.A.B.C VALUES 4.4。** - 2压缩

答案 13 :(得分:0)

理论上,我们永远不会知道,这是一件永无止境的事情:

  

在计算机科学和数学中,术语充分就业定理   已被用来指代一个定理,表明没有算法可以   最佳地执行由某类人完成的特定任务   专业人士。这个名字的出现是因为这样的定理可以确保这一点   有无穷无尽的余地继续发现新的技术来改进   至少完成一些特定任务的方式。例如,完整的   编译器作者的就业定理表明没有这样的定理   作为一个可证明完美的大小优化编译器的东西,作为这样的证明   因为编译器必须检测非终止计算和   将它们减少为单指令无限循环。 因此,存在   一个可证明完美的大小优化编译器意味着一个解决方案   停止问题,这是不存在的,使证明本身成为一个问题   不可判定的问题。

(source)

答案 14 :(得分:-1)

这完全取决于算法。换句话说,问题可能是首先使用此算法压缩文件的次数,然后是下一次...