压缩整数列表以进行搜索访问

Compressing a list of integers for search access

我有一个前缀到行的映射,看起来像这样:

{
    "x":   [9],
    "far": [1,2,3,4,5],
    "car": [1,4,5]
}

键是索引搜索词,数组是匹配行的排序列表。很简单,一个基本的倒排索引。对于这个问题,我们假设 a-z0-9 个最大长度为三个的字符 字符(上限或 36+(36^2)+(36^3)=47,988 种组合,尽管在实践中可能少得多,比如大约 10k 种组合)。

但是,棘手的部分是我可能有大约 1000 万行,而低基数项目可能有一个包含所有 1000 万行的(无意义的)列表。在我的计算中,一个 10M 行的数组本身在未压缩的情况下达到 88.9MB。

压缩这些经常重复的数组的建议方法是什么?看来这在搜索中一定很常见,我想更多地了解处理大型和重复前缀映射的最佳方法,例如上面的方法。

我建议使用像 Roaring Bitmaps 这样的东西(在这个 paper 中有描述)。 Python、Java、C 中都有实现,它们会自动在 3 种不同格式之间切换以获得最佳存储密度。如果你想自己实现类似的东西,它本质上结合了:

  1. 数组(默认)
  2. 位集(适合更密集的集合)
  3. 运行-长度编码(存储每一个"run"连续数的开始和那个运行的长度)

这个概念适用于 32 位无符号整数,它可以轻松地包含 1000 万行的信息,而无需任何额外的工作来自定义您自己的解决方案。