如何为GNSS接收机采集的时序二进制数据选择最优压缩方法
GNSS时序结构化数据压缩优化方案
原有方案效果不佳的原因
- 通用DEFLATE算法仅识别重复字节序列,而GNSS时序原始值的重复度极低,仅能压缩掉少量结构冗余,所以只能达到1.4的压缩比;
- 将uint8、single转成double的操作会主动引入大量填充字节,额外增加了数据体积,因此压缩比进一步下降。
无损压缩优先优化方案(无需修改数据语义)
- 分字段差量预处理:每个字段单独做时序差分:uint8类型直接存储当前值与前一个值的差,浮点类型(double/single)存储当前值与前一个值的XOR运算结果。时序GNSS数据相邻1秒的数值变化极小,差分/XOR后的结果大部分高位为连续0,重复度大幅提升。
- 调整存储分块规则:取消全量数据按字段类型聚合的存储方式,改为每128~1024秒为一个存储块,每个块开头存储该块第一个采样点的全量原始值作为基准,块内剩余采样点仅存储差分/XOR后的结果。块大小可根据数据波动情况调整,数值越稳定块可设置越大。
- 替换压缩算法实现:预处理后的数据可直接使用更高压缩等级的DEFLATE实现
zopfli,或压缩率更高的LZMA2算法(对应7z压缩工具),相比默认zlib可再提升30%~50%的压缩率。完成以上三步后,通常压缩比可以提升至3以上。
深度优化方案(可根据数据特性适配)
- 针对取值为枚举类的uint8参数(如定位状态、跟踪卫星数等),差分前先做行程编码(RLE),连续相同的数值仅存储值+重复次数,静态场景下可将该部分体积压缩到原有的10%以内。
- 针对浮点观测值,可将简单的XOR替换为线性预测编码:用前2~3个历史值做线性回归预测,存储预测值与实际值的残差,残差的0占比会比直接XOR更高,进一步提升后续压缩效率。
- 若业务允许有损压缩,可根据实际精度需求截断浮点数的低位尾数:double类型可保留67位有效数字转成single存储,single类型可截断不必要的低位比特,无损压缩率可再提升12倍,且不会影响常规GNSS解算精度。
验证注意事项
优先取10%的典型样本数据做参数测试,不要做跨精度转换操作,保持原始数据的精度类型,避免引入无效冗余。
内容的提问来源于stack exchange,提问作者Hugo Pontes
相关产品推荐
相关产品推荐

