考虑到某些数组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个电话并不理想。
答案 0 :(得分:3)
确定大小的唯一方法是实际运行压缩算法。如果你想在不为输出字节分配空间的情况下这样做,你可以将一个空Stream
实现作为压缩目标,这样就可以简单地抛出压缩结果,但是数字计算em> of bytes。
像GZip这样的算法所做的压缩类型根据输入的效率会有很大差异。将重复相同字节N次的序列的压缩大小与一行中N个随机字节的压缩大小进行比较,您将看到我的意思。也就是说,如果您的数据具有特征形式,那么您可以使用典型的压缩比来生成近似估算值。