为啥文件压缩后和原文件大小不一样

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥文件压缩后和原文件大小不一样相关的知识,希望对你有一定的参考价值。

我一个网站程序一共有100多M 为什么压缩有就只有几十M 了? 麻烦说一下其中原因。谢谢

文件的大小用字节表示,但在存储的时候却是以簇为分配单元,即一个簇中不能包含两个文件的内容,也就是说无论一个文件有多小,哪怕它只有一个字节,一旦它占用了一个簇,那么别的文件就不能再写入这个簇了,也就是说这个簇中其它还未用上的空间就被浪费了。
每个簇由一个或多个扇区构成,对软盘来说,一个簇只有一个扇区,即512字节;对于硬盘,簇的大小和硬盘分区大小有关,分区容量越大,每个簇的扇区数就越多。对一个含有5个字节的文件,它在软盘上至少要占用512个字节,在硬盘上会更多。每簇的大小由硬盘分区的大小来决定,分区越大,簇就越大。例如1gb的硬盘若只分一个区,那么簇的大小是32kb,也就是说,即使一个文件只有1字节长,存储时也要占32kb的硬盘空间,剩余的空间便全部闲置在那里
光盘的最小扇区也是一样的
你还是找个大容量的光盘吧
参考技术A 这种压缩(无损压缩)就是用更加高效的编码形式,保持信息量不变的情况下减少保存空间

举个例子

(首先文件在硬盘里都是保存为010101011110110000……这种形式)
比如你有个记事本文件,保存了 AAABBC
有三个A,两个B,一个C
如果用前缀码,110表示A,用10表示B,用0表示C,就是11011011010100,需要14位
但是如果发现A出现的频率最大,改用最短的0表示A,然后10表示B,110表示C
就是0001010110,只要10位

这是哈夫曼编码实现压缩的思想(出现频率越大的字符用越短的代码表示)

实际中还用到了很多其他方式的压缩技术,这里就不一一说明了本回答被提问者采纳

为啥不重新压缩整个文件就不能修改 zip 文件?

【中文标题】为啥不重新压缩整个文件就不能修改 zip 文件?【英文标题】:why can't a zip file be modified without re-zipping the entire file?为什么不重新压缩整个文件就不能修改 zip 文件? 【发布时间】:2018-02-09 06:41:07 【问题描述】:

本质上不能对同一个文件进行修改或更改 zip 文件。为此,通过重新压缩整个内容,将旧文件连同新更改一起放入一个新的 zip 文件中。我想知道为什么这是必要的?为什么不重新压缩整个文件就不能修改 zip 文件?

【问题讨论】:

所使用的压缩方案本身可能会根据新文件的大小/内容而改变。此外,您需要知道在哪里附加新的压缩材料,解压缩并从源代码开始可能会更容易。 好的。所以压缩方案对于 zip 文件不是固定的? 好吧,我希望它会被修复,但事情是这样的:假设有新内容出现,通过使用不同的策略来删除冗余信息,我们可以获得比策略更小的最终 ZIP 文件用于文件的较小版本。那么我希望程序会利用这一点。 有道理 【参考方案1】:

经过一番研究,似乎并非如此。事实上,Zip 文件确实允许您在不重新压缩整个存档的情况下添加/删除文件。在最常用的压缩算法“DEFLATE”中,每个文件首先被自己压缩,然后将结果拼接在一起。这意味着在跨多个文件查找模式方面失去了一些潜力,但它确实提供了更好的灵活性,这与 zip 文件的最常见用例相匹配。因此,本质上,当您添加一个新文件时,您只需压缩该单个文件,并将其添加到存档中。这与 .tar.gz 等其他格式形成对比,其中所有文件首先连接在一起 (.tar),然后将结果压缩在一起。

来源:https://en.wikipedia.org/wiki/Zip_(file_format)

【讨论】:

是的,理论上这可能是正确的,但就我所看到的执行此操作的代码而言,会创建一个 tmp 文件并将新文件添加到此临时文件中,该文件稍后将写入原始文件的位置。从原始文件本身创建临时文件是一种开销。感谢您的洞察力 创建临时文件并不意味着重新压缩存档的其余部分,它只是意味着将现有数据复制到某个地方。复制很便宜,而且可能完成的原因是就地编辑在时间复杂度方面执行起来可能更昂贵【参考方案2】:

zip 文件格式旨在允许修改条目(更改、删除、添加)不必重新压缩其他条目。所以你错了。您只需将部分或全部 zip 文件内容复制到同一文件或不同文件中,但无需重新压缩未更改的条目。

【讨论】:

以上是关于为啥文件压缩后和原文件大小不一样的主要内容,如果未能解决你的问题,请参考以下文章

文件夹大小基本差不多,可为啥压缩出来的文件包却相差那么大?

同样大小的文件不同压缩后会不会大小不一样?那再把解压的他们还原后有没有可能原来的文件就不同大小了

为啥我压缩了文件与压缩前的大小差不多?

请问为啥同一个压缩文件显示的大小却不同呢?

同样的压缩文件在两台电脑上显示大小不一样是啥原因

我认为 PNG 在大小方面比 gif 具有更好的文件压缩率。那为啥我的 PNG 比我的 gif 大?我用pycharm转换文件