0

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

我似乎找不到任何关于使文件压缩比另一个文件更好的信息。

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

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

4

3 回答 3

2

压缩数据的唯一方法是去除冗余。这本质上是任何压缩工具所做的 - 它查找冗余/可重复部分,并用链接/引用替换它们,以指向之前在您的流中观察到的相同数据。

如果你想让你的数据格式更有效,你应该删除所有可能被删除的东西。例如,以二进制而不是文本(JSON、XML 等)存储数字更有效。如果您必须使用文本格式,请考虑删除不必要的空格或换行符。

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

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

于 2013-09-15T05:41:20.570 回答
1

由于您说的是 32 位浮点数和 16 位整数,因此您已经将它们编码为二进制。

考虑数字的范围和有用的准确性。如果您可以限制这些,您可以使用更少的位重新编码数字。尤其是浮点数,它的位数可能比您需要的多。

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

如果您的数字彼此之间存在某种相关性,那么您应该利用它。例如,如果连续数字之间的差异通常很小,例如波形表示就是这种情况,则发送差异而不是数字。可以使用可变长度整数或霍夫曼编码或组合对差异进行编码,例如用于范围的霍夫曼编码和每个范围内的额外位。

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

所有这些都需要对您的数据(最好是大量数据)进行实验,以了解哪些有帮助,哪些没有帮助或只有边际收益。

于 2013-09-15T14:45:54.913 回答
0

使用二进制而不是文本。

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

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

但是,尽管这对未压缩的文件有很大的不同,但这些差异在压缩后可能会消失,因为压缩算法应该隐含地注意这种情况。不过你可以试试。

于 2013-09-15T06:21:45.353 回答