我正在为一个项目进行头脑风暴,该项目将在数据库中存储大量坐标数据(纬度,经度)。将计算和存储此数据的关键方面,然后压缩和存储大量数据。我正在寻找一种无损压缩算法来减少这些数据的存储空间。是否有一种(最好是通用的)算法,它能很好地压缩这种类型的数据?
[[0.12345, 34.56789], [0.01234, 34.56754], [-0.00012, 34.56784], …]
注意:我现在不太关心语言,但我可能会在Javascript和PHP中实现这一点。
提前致谢!
答案 0 :(得分:3)
要扩展barak manos建议的delta编码,首先应将坐标编码为二进制数而不是字符串。使用四字节有符号整数,每个整数等于10 5 乘以你的值。
然后应用delta编码,其中每个纬度和经度分别从前一个减去。第一个纬度/经度原样保留。
现在将数据分成四个平面,一个用于32位整数中的每个四字节。较高的字节将大部分为零,所有较低字节的熵。您可以将数据分成块,这样您的平面就不必跨越整个数据集。
然后应用zlib或lzma压缩。
答案 1 :(得分:2)
我建议您首先利用相邻符号相似的事实,然后转换数据以减少熵。然后,在输出中应用您选择的压缩算法。
让IN_ARR为原始数组,OUT_ARR为转换后的数组(压缩输入):
OUT_ARR[0] = IN_ARR[0]
for i = 1 to N-1
OUT_ARR[i] = IN_ARR[i] - IN_ARR[i-1]
为简单起见,上面的伪代码是为一维坐标编写的。
但是,当然,您可以轻松地将其实现为二维坐标...
当然,您必须在解压缩之后应用反向操作:
IN_ARR[0] = OUT_ARR[0]
for i = 1 to N-1
IN_ARR[i] = OUT_ARR[i] + IN_ARR[i-1]
答案 2 :(得分:1)
以下是有效构建数据以充分利用数据的方法: -
首先将数据分为两组,分别为整数和小数: -
例如:[1.23467,2.45678] => [1,2] and [23467,45678] => [1],[2],[23467],[45678]
由于您的数据似乎是随机的,因此您可以为压缩做的第一件事就是不将其直接存储为字符串,而是使用后续压缩。
纬度范围是-90到+90因此总共180个值因此需要log2(180)位,即第一个值为每个整数8位
分类的范围是-180到180,这是360值,因此log2(360)位是9位
小数是5位数,因此需要log2(10 ^ 5)= 17位。
使用上面的压缩,每个记录需要8+9+17*2 = 51
位,而如果你使用字符串,则每个记录最多需要2 + 3 + 5 * 2 = 15个字节。
如果与字符串数据大小
51/(15*8) = 42%
如果与浮动数据大小相比,压缩率= 51/(2*32) = 80
%。
将路径的相似部分分组为4组,例如: -
[[0.12345,34.56789],[0.01234,34.56754],[ - 0.00012,34.56784] ...]
=> [0,0,-O],[34,34,34],[12345,1234,12],[56789,56754,56784]
对单个组使用增量编码,然后应用霍夫曼编码以进一步压缩总数据。