【问题标题】:How should I choose the best data compression method for my data?我应该如何为我的数据选择最佳的数据压缩方法?
【发布时间】:2021-09-05 23:39:12
【问题描述】:

我做了一些研究,但在数据压缩方面我可以说我是一个完全的初学者。

我需要压缩来自 GNSS 接收器的数据。这些数据由一系列随时间测量的参数组成——更具体地说是在 1Hz 的 X 秒内测量的参数——如下所示:

X uint8 参数,X uint8 参数,X 双参数,X 双,X 单,X 单。

数据以二进制文件的形式存储在这个序列中。

使用通用 LZ77 压缩工具,我设法实现了 1.4 的压缩比(这是通过 zlib DEFLATE 实现的),我想知道是否可以进一步压缩它。我知道这在很大程度上取决于数据本身,所以我要问的是我可以使用哪些算法或软件更适合我要压缩的数据结构 .以不同的方式排列数据也是我可以改变的。事实上,我什至尝试将所有数据转换为双精度数据,然后使用专门针对双精度流的压缩器,但无济于事,数据压缩率甚至低于 1.4。

换句话说,您将如何处理这些数据的压缩问题?由于我缺乏关于数据压缩的知识,恐怕我没有以最合适的方式为压缩器提供数据,或者我应该使用不同的压缩算法。如果您能提供帮助,我将不胜感激。谢谢!

【问题讨论】:

    标签: compression


    【解决方案1】:

    使用增量编码。从先前的对应值中减去后续值。在另一端添加增量以恢复原始数据。增量编码的数据应该更容易压缩。

    【讨论】:

      【解决方案2】:

      时间序列压缩的最新技术是分位数压缩。它压缩数字序列(例如整数、浮点数、时间戳),并且通常比其他方法实现高 35% 的压缩率。它具有增量编码作为内置功能。

      CLI 示例:

      cargo run --release compress \
        --csv my.csv \
        --col-name my_col \
        --level 6 \
        --delta-order 1 \
        out.qco
      

      Rust API 示例:

      let my_nums: Vec<i64> = ...
      let compressor = Compressor::<i64>::from_config(CompressorConfig {
        compression_level: 6,
        delta_encoding_order: 1,
      });
      let bytes: Vec<u8> = compressor.simple_compress(&my_nums);
      println!("compressed down to {} bytes", bytes.len());
      

      它通过用一个范围([下限,上限]界限)的霍夫曼代码描述每个数字,然后是该范围的精确偏移量来做到这一点。通过根据您的数据战略性地选择范围,它接近数据分布的香农熵。

      对于非常平滑的数据序列,您甚至可以考虑大于 1 的 delta 阶(例如 delta 阶 2 是“delta-of-deltas”)。

      【讨论】:

        【解决方案3】:

        问题是我没有按顺序将数据写入文件。 我正在从不同的卫星读取数据,并且一次将数据写入文件一个参数,这意味着实际的连续读取被其他卫星的数据中断。 关键是依次写入涉及特定卫星的所有数据,然后再写入另一个卫星,以此类推,使数据流尽可能连续,从而创建更小的增量,我相信

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-30
          • 1970-01-01
          • 1970-01-01
          • 2011-06-15
          • 2012-12-17
          • 2014-04-17
          • 2014-11-30
          • 2010-09-06
          相关资源
          最近更新 更多