我想压缩一些数据,所以我以为我会通过deflate运行流
它从304字节增加到578.这个数字增加了1.9倍。我试图压缩它..... 我在这做错了什么?
using (MemoryStream ms2 = new MemoryStream())
using (var ms = new DeflateStream(ms2, CompressionMode.Compress, true))
{
ms.WriteByte(1);
ms.WriteShort((short)txtbuf.Length);
ms.Write(txtbuf, 0, txtbuf.Length);
ms.WriteShort((short)buf2.Length);
ms.Write(buf2, 0, buf2.Length);
ms.WriteShort((short)buf3.Length);
ms.Write(buf3, 0, buf3.Length);
ms.Flush();
result_buf = ms2.ToArray();
}
答案 0 :(得分:4)
您的数据扩展的程度是DeflateStream类中的错误。该错误也存在于GZipStream类中。请在此处查看我对此问题的描述:Why does my C# gzip produce a larger file than Fiddler or PHP?。
不要使用Microsoft提供的DeflateStream类。请改用DotNetZip,它提供替换类。
当您尝试压缩不可压缩数据时,它会稍微扩展,但只会少量扩展。正确编写的放气压缩器的最大扩展是五个字节加上一小部分百分比。 zlib不可压缩数据的扩展(使用raw deflate的默认设置)是输入大小的5个字节+ 0.03%。你的304字节,如果不可压缩, 应该来自像deflateStream这样的原始deflate压缩器的309字节。对超过五或六个字节长度的东西进行1.9扩展是一个错误。
答案 1 :(得分:3)
您尝试压缩的数据可能实际上不可压缩(或者您没有很多数据需要压缩才能开始)。当数据中有重复时,压缩效果最佳。
它可能更大,因为压缩方案是添加用于解密流的元数据,但由于数据不可压缩或者没有大量数据可以使压缩生效,实际上它使情况变得更糟。
如果您执行类似zip压缩文件的操作,您会发现解压缩并不总是会让事情变得更小。
答案 2 :(得分:3)
小块数据通常会变得更大,因为压缩算法使用的代码表会添加到输出中,或者需要更大的样本才能找到足够的数据。
你没有做错任何事。
答案 3 :(得分:2)
不应该是
using (var ms = new DeflateStream(ms2, CompressionMode.Compress, true))
而不是
using (var ms = new DeflateStream(ms, CompressionMode.Compress, true))
如果你想用DeflateStream来装饰你的MemoryStream,它应该是这种方式。
答案 4 :(得分:0)
您在评论中回答了自己的问题:
我不知道我改变了什么,但数据是在每次运行中随机发生的
随机数据是 hard 来压缩。通常,当数据中包含许多模式(如字典或网站中的文本)时,它会很好地压缩。但是压缩算法的最坏情况是当你面对随机数据时。真正随机的数据中没有任何模式;那么压缩算法怎么能期望能够压缩它?
接下来要考虑的是,某些压缩算法在存储数据方面存在开销。它们通常有一些标题位,后跟一些符号数据。对于随机数据,几乎不可能将数据压缩成其他形式,并且最终会在数据之间散布大量的标题位,除了说“以下数据表示为此类”之外没有任何目的。
根据您的压缩格式,开销占文件总大小的百分比可能相对较小或较大。但在任何一种情况下,将的开销会使您的新文件大于旧文件。
答案 5 :(得分:0)
我没有留下评论的声誉,但压缩性能比你预期的更糟糕的原因是不由于本身的错误,但显然是专利1:< / p>
压缩级别不如其他应用程序那么好的原因是市场上最有效的压缩算法都受到专利保护。另一方面,.net使用非专利的。
和
好吧,我得到的解释(来自MS的某个人),当我问同样的事情时,是因为它与微软无法使用GZip算法而不修改它有关;由于专利/许可问题。
初始我怀疑微软的gzip实现;我知道他们实施的Deflate算法不是最有效的,但没有专利。
http://challenge-me.ws/post/2010/11/05/Do-Not-Take-Microsofts-Code-for-Granted.aspx