【问题标题】:How to optimally compress inverted indexes for time series dataset如何优化压缩时间序列数据集的倒排索引
【发布时间】:2021-03-19 21:21:07
【问题描述】:

我正在尝试以 25% 的压缩率压缩时间序列数据集。这对我来说变成了仇杀。

数据是 1 个月内以 1 分钟为间隔的历史股票报价(请参阅数据集注释),缺失数据为 0。这相当于大约 9000 个 uint32_t 类型的数据点(我不做小数)

我的第一次尝试是对所有数据使用 FastPFor 压缩。这导致了约 80% 的压缩比。还不够好。所以——

我先去掉所有的时间戳(很明显)

然后我对历史数据进行了排序并删除了所有重复项。这将唯一值的数量从 ~ 5000 减少到 1000。从那里,我使用差分 SIMD compression algorithm 进一步压缩它。这些也有点包装。这导致最终约 5% 的压缩比。伟大的!问题来了。

要重建数据集,您必须能够将其按顺序放回原处。我的想法是为上面每个处理过的值设置倒排索引——每个索引都指向它的原始位置。 这当然只是添加了 9000 个数字。这使大小几乎达到了原始大小。

例子:

Values    Indexes 

10  ===>  40, 20, 55, 100, 56, 21 

25  ===>  1, 5 

...

因此,我尝试压缩倒排索引。

  1. 对它们进行排序
  2. 去掉任何比前一个值 +1 的值 (RLE)
  3. 使用 Lemire 的 SIMDCompression github 压缩每个索引列表(我还尝试了他的 FastPFor 算法)

不幸的是,这种压缩索引的尝试并不好。在实际压缩使用每个整数 20-64 位之后,它只产生了约 75% 的压缩率。请注意,之前我提到我使用的是 32 位数字。压缩后的索引列表只有 1 个数字,是其原始大小的 2 倍(我希望它保持不变)。

使用倒排索引的尝试是徒劳的——当它与原始大小相当时,不足以证明额外处理是合理的。

我的一些其他想法:

  • 确定最常见的数字序列,使用 'huffman' 类型编码,您可以在其中指定特定值来表示它。

  • 压缩算法在处理更多数据时效果更好 - 可能将所有索引合并到 1 个数组中,然后压缩一次?

压缩倒排索引的最佳方法是什么?

是否存在理论上的最小压缩?

你知道我可以用什么方法来代替这个吗?

感谢任何输入。

示例数据

注意事项

  • 索引的使用将仅用于重建数据集,而不用于任何其他查询。

【问题讨论】:

    标签: indexing compression inverted-index bit-packing


    【解决方案1】:

    整个排序似乎毫无意义。

    我取了你的 8000(不是 9000)值系列,取了差异,并将它们写为可变长度整数,结果大约 14,000 字节。然后我用 gzip 压缩得到大约 6000 字节。您没有说 25% 的起点是什么,但如果是四字节二进制整数(32,000 字节),那么这种方法会将其减少到 20% 以下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      相关资源
      最近更新 更多