【问题标题】:Compressing with GZipStream results in more bytes使用 GZipStream 压缩会产生更多字节
【发布时间】:2015-09-23 14:53:53
【问题描述】:

我正在使用以下方法来压缩我的回复内容:

(考虑_compression = CompressionType.GZip

private async Task<HttpContent> CompressAsync(HttpContent content)
{
     if(content == null) return null;
     byte[] compressedBytes;
     using(MemoryStream outputStream = new MemoryStream())
     {
         using (Stream compressionStream = GetCompressionStream(outputStream))
         using (Stream contentStream = await content.ReadAsStreamAsync())
             await contentStream.CopyToAsync(compressionStream);

         compressedBytes = outputStream.ToArray();
     }

     content.Dispose();

     HttpContent compressedContent = new ByteArrayContent(compressedBytes);
     compressedContent.Headers.ContentEncoding.Add(GetContentEncoding());
     return compressedContent;
}

private Stream GetCompressionStream(Stream output)
{
    switch (_compression)
    {
        case CompressionType.GZip: { return new GZipStream(output, CompressionMode.Compress); }
        case CompressionType.Deflate: { return new DeflateStream(output, CompressionMode.Compress); }
        default: return null;
    }
}

private string GetContentEncoding()
{
    switch (_compression)
    {
        case CompressionType.GZip: { return "gzip"; }
        case CompressionType.Deflate: { return "deflate"; }
        default: return null;
    }
}

但是,此方法返回的字节数比原始内容多。

例如,我的初始内容是 42 字节长,而生成的 compressedBytes 数组的大小为 62 字节。

我在这里做错了吗?压缩如何产生更多字节?

【问题讨论】:

标签: c# asp.net .net stream gzip


【解决方案1】:

你不一定做错了什么。您必须考虑到这些压缩格式总是需要一些空间来存储标题信息。所以这可能就是它增长了几个字节的原因。

在正常情况下,您会压缩大量数据。在这种情况下,与通过压缩数据获得的收益相比,与标题数据相关的开销变得不明显。

但是,由于在这种情况下,您的未压缩数据非常小,因此您可能不会在压缩中获得太多收益,因此这是您实际上可以注意到标头占用空间的少数情况之一。

【讨论】:

    【解决方案2】:

    当使用 gzip 压缩小文件时,元数据(对于压缩文件本身)可能会导致比压缩节省的字节数更大。

    Googles gzip tips

    信不信由你,在某些情况下 GZIP 可以增加资产的大小。通常,当资产非常小并且 GZIP 字典的开销高于压缩节省时,或者资源已经被很好地压缩时,就会发生这种情况。

    【讨论】:

      【解决方案3】:

      对于如此小的大小,压缩开销实际上可以使文件变大,这并不罕见。 Here 解释的更详细了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多