4

我想压缩一些数据,所以我想我会通过放气来运行流

它从 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();
}
4

6 回答 6

4

您的数据扩展程度是 DeflateStream 类中的一个错误。该错误也存在于 GZipStream 类中。请在此处查看我对此问题的描述:为什么我的 C# gzip 生成的文件比 Fiddler 或 PHP 大?.

不要使用 Microsoft 提供的 DeflateStream 类。改用DotNetZip,它提供替换类。

当您尝试压缩不可压缩的数据时,它会略微膨胀,但只是一小部分。正确编写的 deflate 压缩器的最大扩展是 5 个字节加上百分之一的一小部分。 zlib对不可压缩数据的扩展(原始 deflate 的默认设置)为 5 字节 + 输入大小的 0.03%。您的 304 字节(如果不可压缩)应该从像 Def​​lateStream 这样的原始 deflate 压缩器中以 309 字节的形式出现。对长度超过 5 或 6 个字节的内容进行 1.9 倍扩展是一个错误。

于 2012-07-14T15:29:19.567 回答
3

您尝试压缩的数据可能实际上不可压缩(或者您一开始没有很多数据要压缩)。当数据中有重复时,压缩效果最好。

它可能更大,因为压缩方案正在添加用于解密流的元数据,但由于数据不可压缩或没有很多数据可供压缩生效,它实际上使情况变得更糟。

如果您执行压缩 zip 文件之类的操作,您会发现解压缩并不总是会使文件变小。

于 2012-07-14T05:58:30.250 回答
3

小数据块通常最终会变大,因为压缩算法使用了一个添加到输出中的代码表,或者它需要更大的样本才能找到足够的样本来处理。

你没有做错什么。

于 2012-07-14T05:59:18.957 回答
2

难道不应该

using (var ms = new DeflateStream(ms2, CompressionMode.Compress, true))

代替

using (var ms = new DeflateStream(ms, CompressionMode.Compress, true))

如果你想用 DeflateStream 装饰你的 MemoryStream,它应该是这样的。

于 2012-07-14T05:58:34.103 回答
0

您在评论中回答了自己的问题:

我不知道我改变了什么,但数据是在每次运行中随机生成的

随机数据很难压缩。一般来说,当数据中有很多模式(如字典或网站中的文本)时,它会很好地压缩。但压缩算法最糟糕的情况是当您面对随机数据时。真正随机的数据中没有任何模式;那么压缩算法怎么能期望能够压缩它呢?

接下来要考虑的是,某些压缩算法在存储数据方面存在开销。它们通常有一些标头位,后跟一些符号数据。对于随机数据,几乎不可能将数据压缩成其他形式,并且最终会在数据之间散布大量标头位,这些标头位除了说“以下数据就是这样表示”之外没有其他用途。

根据您的压缩格式,开销占总文件大小的百分比可能相对较小或较大。但是,无论哪种情况,您都会有开销使您的新文件比旧文件大。

于 2012-07-14T15:37:18.377 回答
0

我没有发表评论的声誉,但是压缩性能比您预期的要差的原因并不是由于错误本身,而是由于专利错误:

压缩级别不如其他一些应用程序的原因是市场上最有效的压缩算法都受专利保护。另一方面,.net 使用非专利技术。

好吧,当我问同样的问题时(从 MS 的某个人那里)得到的解释是,这与微软无法在不修改 GZip 算法的情况下使用它有关;由于专利/许可问题。

http://social.msdn.microsoft.com/Forums/fr-FR/c5f0b53c-a2d5-4407-b43b-9da8d39c01df/why-do-gzipstream-compression-ratio-so-bad?forum=netfxbcl

最初我怀疑微软的 gzip 实现;我知道他们实施了 Deflate 算法,该算法不是最有效但没有专利。

http://challenge-me.ws/post/2010/11/05/Do-Not-Take-Microsofts-Code-for-Granted.aspx

于 2014-07-06T20:52:47.100 回答