如何编写gzip文件?

时间:2013-09-15 05:11:10

标签: compression gzip

我正在开发一个Web项目,我需要创建一种格式来非常有效地传输文件(大量数据)。数据完全是数字的,并分为几个部分。当然,这将通过gzip压缩传输。

我似乎无法找到有关文件压缩比其他文件更好的信息。

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

P.S。这将是很多数据,因此节省5%意味着很多。在浮点数中不可能有任何重复,但整数可能会在每个文件中重复约5-10次。

3 个答案:

答案 0 :(得分:2)

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

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

高效二进制格式的一个很好的例子是google protocol buffers。它有很多好处,其中最重要的是将数字存储为可变字节数(即数字1消耗的空间少于数字1000000)。

文本或二进制,但如果您可以在发送之前对数据进行排序,则可以增加gzip压缩器查找冗余部分的可能性,并且最有可能提高压缩率。

答案 1 :(得分:1)

由于你说过32位浮点数和16位整数,你已经用二进制编码了。

考虑数字的范围和有用的准确性。如果可以限制,可以使用较少的位重新编码。特别是浮子,可能比你需要的更多。

如果正确的位数不是8的倍数,则将您的字节流视为位流并仅使用所需的位。请小心处理数据的正确结束,以便添加到下一个字节边界的位不会被解释为另一个数字。

如果你的数字彼此有一定的相关性,那么你应该利用它。例如,如果连续数字之间的差异通常较小(例如波形表示的情况),则发送差异而不是数字。差异可以使用可变长度整数或霍夫曼编码或组合来编码,例如,霍夫曼编码每个范围内的范围和额外位。

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

所有这一切都需要对您的数据进行试验,理想情况下需要对您的数据进行大量实验,以确定哪些有用,哪些无效或仅具有边际效益。

答案 2 :(得分:0)

使用二进制代替文本。

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

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

但是虽然这对未压缩文件有很大的不同,但压缩后这些差异可能会消失,因为压缩算法应该隐含地注意这一点。但你可以试试。