gzip压缩给定字符串的紧密程度是多少?

时间:2017-01-26 21:52:47

标签: .net compression gzip

考虑到某些数组array()的字符或字节长度,有没有办法知道结果的压缩长度/大小是多少?

下面是一个示例代码。

    Dim c() As Byte
    Using memory As System.IO.MemoryStream = New System.IO.MemoryStream()
        Using gzip As System.IO.Compression.GZipStream = New System.IO.Compression.GZipStream(memory, System.IO.Compression.CompressionMode.Compress, True)
            gzip.Write(array, 0, array.Length)
        End Using
        c = memory.ToArray()
    End Using

我可以运行测试,例如数据类型(我碰巧使用所有ASCII字符,一个简单的XML,所以我得到了大约9:1的压缩),但有没有办法知道压缩前的压缩率和查询?

我的具体用例是array()中的可变数量的输入数据,通过webservice压缩并发送到限制呼叫大小的API。如果我的压缩数据对于一次调用来说太长了(可能每10次调用一次就会发生),我将能够循环并发送多个调用,但我不知道如何判断什么是太大。

我可以做一个保守的猜测(也许,我知道压缩至少是1.5:1,所以不要创建一个array(),这会使1.5:1的压缩字符串大于此API允许),但我希望更精确一点。这个网络服务也限制了每天的通话次数,因此每天发送100个电话并不理想。

1 个答案:

答案 0 :(得分:3)

确定大小的唯一方法是实际运行压缩算法。如果你想在不为输出字节分配空间的情况下这样做,你可以将一个空Stream实现作为压缩目标,这样就可以简单地抛出压缩结果,但是数字 of bytes。

像GZip这样的算法所做的压缩类型根据输入的效率会有很大差异。将重复相同字节N次的序列的压缩大小与一行中N个随机字节的压缩大小进行比较,您将看到我的意思。也就是说,如果您的数据具有特征形式,那么您可以使用典型的压缩比来生成近似估算值。