1. 位图编码(Bitpacking)对低基数列的压缩
位图编码(Bitpacking)如何对低基数列进行压缩?
- Bitpacking 的原理(按最小位数打包)
- 低基数列的压缩效果
- 与字典编码配合
Bitpacking(位打包)把整数按"实际所需的最小位数"紧凑存储,而非固定 32/64 位。原理:先确定列中值的最大位宽(如值 0~255 需要 8 位,0~7 需要 3 位),然后把每个值按该位宽连续打包,去掉高位零,减少存储位数。对低基数列(取值少、值域小),所需位数少,压缩效果好——例如某列只有 0~7 八个值,用 3 位打包比 32 位存节省 8 倍以上。Bitpacking 常与字典编码配合:先把列值映射为字典 ID(ID 是 0..n 的小整数),再对 ID 做 Bitpacking,进一步压缩。Bitpacking 的优点是解码效率高(可按 SIMD 批量解包)、无损,适合"整数 + 低位宽"的列。缺点是若列值域跨度大(有少量大值),最大位宽高,压缩效果差,此时可配合"前移溢出"(如 Frame-of-Reference,把值减去最小值)或分块处理。
Bitpacking 的核心是"按最大值确定位宽,去掉无用高位"。低基数映射为小整数 ID 后位宽小,压缩率高;配合字典或参照系(减去最小值)可进一步压缩。