我正在做一个网络项目,我需要创建一种格式来高效地传输文件(大量的数据)。数据完全是数字的,并分成几个部分。当然,这将通过gzip压缩进行传输。
我似乎找不到比其他文件更好地压缩文件的任何信息。
如何以最小gzip大小的格式编码浮点数(32位)和短整数(16位)?
附注:这将是大量的数据,所以节省5%意味着很多这里。浮点数中不可能有任何重复,但是整数可能在每个文件中重复5-10次。
发布于 2013-09-15 05:41:20
压缩数据的唯一方法是消除冗余。这基本上就是任何压缩工具所做的事情--它查找冗余/可重复的部件,并将它们替换为链接/引用,这些链接/引用与您之前在流中观察到的数据相同。
如果希望提高数据格式的效率,则应该删除可能删除的所有内容。例如,用二进制而不是文本(JSON、XML等)存储数字更有效。如果您必须使用文本格式,请考虑删除不必要的空格或行提要。
高效二进制格式的一个很好的例子是google协议缓冲区。它有很多优点,其中最重要的是将数字存储为可变字节数(即,数字1消耗的空间小于数字1000000)。
文本或二进制文件,但是如果您可以在发送之前对数据进行排序,那么gzip压缩器查找冗余部件的可能性就会增加,而且很可能会增加压缩比。
发布于 2013-09-15 14:45:54
既然你说了32位浮点数和16位整数,你已经在用二进制编码它们了。
考虑一下你的数字的范围和有用的准确性。如果可以限制这些值,则可以使用较少的位对数字进行重新编码。特别是浮动,它可能有更多的比特,你需要。
如果正确的位数不是8的倍数,那么将您的字节流看作一个位流,并且只使用所需的位。要小心正确地处理数据的末尾,这样添加到下一个字节边界的位就不会被解释为另一个数字。
如果你们的数字之间有某种相关性,那么你们应该利用这一点。例如,如果连续数字之间的差异通常很小,例如波形的表示就是这样,那么发送差异而不是数字。差异可以使用可变长度整数或Huffman编码或组合来编码,例如,用于每个范围内的范围和额外比特的Huffman码。
如果您可以使用其他关联,那么根据前面的值为下一个值设计一个预测器。然后发送实际值和预测值之间的差额。在前面的示例中,预测器只是最后一个值。一个更复杂的预测器的例子是一个2D预测器,当数字表示一个2D表时,相邻的行和列都是相关的。PNG图像格式有几个2D预测器的例子。
所有这些都需要对您的数据(最好是大量的数据)进行实验,以了解哪些是有用的,哪些不是或只具有边际的好处。
发布于 2013-09-15 06:21:45
使用二进制而不是文本。
它的文本表示形式中的浮点数为8位(浮点数的精度为8小数位),加上小数分隔符,加上字段分隔符,消耗了10个字节。在二进制表示中,它只需4。
如果您需要使用文本,请使用十六进制。它消耗的数字更少。
但是,尽管这对未压缩的文件有很大的不同,但是这些差异在压缩后可能会消失,因为压缩algo应该隐式地注意如果那样的话。但你可以试试。
https://stackoverflow.com/questions/18809128
复制相似问题