首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何才能很好地编写gzip文件?

如何才能很好地编写gzip文件?
EN

Stack Overflow用户
提问于 2013-09-15 05:11:10
回答 3查看 227关注 0票数 0

我正在做一个网络项目,我需要创建一种格式来高效地传输文件(大量的数据)。数据完全是数字的,并分成几个部分。当然,这将通过gzip压缩进行传输。

我似乎找不到比其他文件更好地压缩文件的任何信息。

如何以最小gzip大小的格式编码浮点数(32位)和短整数(16位)?

附注:这将是大量的数据,所以节省5%意味着很多这里。浮点数中不可能有任何重复,但是整数可能在每个文件中重复5-10次。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-15 05:41:20

压缩数据的唯一方法是消除冗余。这基本上就是任何压缩工具所做的事情--它查找冗余/可重复的部件,并将它们替换为链接/引用,这些链接/引用与您之前在流中观察到的数据相同。

如果希望提高数据格式的效率,则应该删除可能删除的所有内容。例如,用二进制而不是文本(JSON、XML等)存储数字更有效。如果您必须使用文本格式,请考虑删除不必要的空格或行提要。

高效二进制格式的一个很好的例子是google协议缓冲区。它有很多优点,其中最重要的是将数字存储为可变字节数(即,数字1消耗的空间小于数字1000000)。

文本或二进制文件,但是如果您可以在发送之前对数据进行排序,那么gzip压缩器查找冗余部件的可能性就会增加,而且很可能会增加压缩比。

票数 2
EN

Stack Overflow用户

发布于 2013-09-15 14:45:54

既然你说了32位浮点数和16位整数,你已经在用二进制编码它们了。

考虑一下你的数字的范围和有用的准确性。如果可以限制这些值,则可以使用较少的位对数字进行重新编码。特别是浮动,它可能有更多的比特,你需要。

如果正确的位数不是8的倍数,那么将您的字节流看作一个位流,并且只使用所需的位。要小心正确地处理数据的末尾,这样添加到下一个字节边界的位就不会被解释为另一个数字。

如果你们的数字之间有某种相关性,那么你们应该利用这一点。例如,如果连续数字之间的差异通常很小,例如波形的表示就是这样,那么发送差异而不是数字。差异可以使用可变长度整数或Huffman编码或组合来编码,例如,用于每个范围内的范围和额外比特的Huffman码。

如果您可以使用其他关联,那么根据前面的值为下一个值设计一个预测器。然后发送实际值和预测值之间的差额。在前面的示例中,预测器只是最后一个值。一个更复杂的预测器的例子是一个2D预测器,当数字表示一个2D表时,相邻的行和列都是相关的。PNG图像格式有几个2D预测器的例子。

所有这些都需要对您的数据(最好是大量的数据)进行实验,以了解哪些是有用的,哪些不是或只具有边际的好处。

票数 1
EN

Stack Overflow用户

发布于 2013-09-15 06:21:45

使用二进制而不是文本。

它的文本表示形式中的浮点数为8位(浮点数的精度为8小数位),加上小数分隔符,加上字段分隔符,消耗了10个字节。在二进制表示中,它只需4。

如果您需要使用文本,请使用十六进制。它消耗的数字更少。

但是,尽管这对未压缩的文件有很大的不同,但是这些差异在压缩后可能会消失,因为压缩algo应该隐式地注意如果那样的话。但你可以试试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18809128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档