Hotdry.

Article

fc 浮点流压缩器:语义区间分组与多模式竞争的工程实现

解析 fc 压缩器基于自适应分块、50 种编解码器竞争与 SIMD 优化的浮点流无损压缩算法工程路径。

2026-05-13systems

科学计算与日志时序数据通常以 IEEE-754 双精度浮点数(64-bit doubles)的形式存储,这类数据的特点是数值连续、局部相关性高,但传统的通用压缩器(如 zstd、lz4)难以捕捉其语义结构。fc 压缩器针对这一场景设计了一套基于语义区间分组与多模式竞争的压缩框架,在保持无损的前提下实现了 3.07 倍的平均压缩比,同时解码吞吐率达到 1277 MB/s。

浮点流压缩的核心挑战

浮点数的二进制表示由符号位、指数位和尾数位组成,直接对原始字节进行 LZ 类压缩往往效果有限。例如,两个相邻的浮点数 3.14159 和 3.14160 在内存中可能呈现出完全不同的字节模式,因为它们的指数部分和尾数部分的差异分布并不均匀。因此,有效的浮点压缩必须理解数据的语义特征 —— 是恒定的、线性的、周期性的,还是带有噪声的随机游走 —— 并针对不同特征选择最合适的编码策略。

fc 的解决思路是:将输入流切分为自适应大小的块(称为 quantum),对每个块进行特征探测,然后从 50 种专用编解码器中选择最优方案。这种 "分块竞争" 架构既保证了全局的压缩效率,又允许每个块根据其局部特性获得最佳编码。

自适应分块与特征门控

fc 的默认分块大小为 256 KiB,但通过 ceq_probe_chunk_values 探测机制,当数据呈现低熵特征时,块大小可自适应扩展至 1 MiB。这种动态调整避免了在高度可压缩的数据上浪费元数据开销,同时在复杂数据区域保持细粒度控制。

特征门控是模式竞争的关键优化。fc 在编码前对每个块进行快速特征扫描,提取包括数值范围(exp_range)、符号翻转频率(sign_flips)、不同值数量(distinct_count)以及重复模式检测(looks_like_repeats)等特征。基于这些特征,编码器决定哪些编解码器值得参与竞争,避免在明显不匹配的模式上浪费 CPU 周期。

语义区间分组与专用编码器

fc 的 50 种编解码模式可以归纳为几个语义类别,每一类针对特定的数据特征:

预测器家族(PRED、PRED2、PRED4、PRED_TANS 等)采用 FCM/DFCM 风格的哈希预测器,利用浮点流的局部可预测性。预测残差通过 tANS(非对称数字系统)或 Range Coding 进行熵编码,前者在解码速度上更优,后者在压缩比上更有优势。预测器表的大小由参数 p 控制,其 log2 值在 [10, 16] 范围内可调,更大的表意味着更高的预测精度但也带来更多的内存访问开销。

XOR/Delta 家族(XORZ、XOR128、DELTA2 等)针对浮点数的位级特性设计。由于相邻浮点数的指数部分往往相同或相近,对它们进行 XOR 或差分运算后,结果通常包含大量前导零,便于后续的零游程编码。

浮点专用模式(FLOAT32、FLOAT_MULT、INT_MULT、ALP、ELF)则深入理解 IEEE-754 格式本身。例如,ALP(Adaptive Lossless Floating-point)模式会分析数值的分布特征,自适应选择尾数截断策略;ELF(Erasing Last bits)模式则利用浮点精度冗余,安全地擦除不影响数值精度的低位比特。

多线程并行与 SIMD 优化

fc 的编码和解码均支持多线程并行。编码阶段,工作线程从块队列中拉取任务,独立执行模式竞争,最终将最优结果写入输出流。解码阶段,fc_dec 自动根据在线 CPU 核心数(上限 128)和块数量选择工作线程数,实现近乎线性的扩展。

热路径代码采用手写 SIMD 向量化,要求 x86-64 平台支持 AVX2、SSE4.2、BMI 和 LZCNT 指令集。这种底层优化使得解码吞吐率达到 1277 MB/s,约为编码吞吐量的 10 倍,非常适合写入一次、读取多次的时序存储场景。

性能权衡与调参建议

fc 的设计明确偏向压缩比而非编码速度。在 17 个合成数据集上的基准测试中,fc 的平均编码吞吐量为 120 MB/s,远低于 lz4 的 2176 MB/s 或 zstd-3 的 528 MB/s。因此,fc 更适合作为后台批处理或归档存储的压缩方案,而非实时流式编码。

对于生产环境的调参,建议关注以下几点:

  1. 预测器表大小:默认配置使用 p=18(实际被钳位到 16),对于大多数科学计算数据已足够。如果内存带宽受限,可以尝试降低至 14 或 15。

  2. 线程数:编码线程数通过 fc_cfg.t 显式配置,建议设置为物理核心数或略低,避免超线程带来的缓存竞争。

  3. 数据预处理:对于包含大量重复字典项或量化级别的数据,fc 可能不如通用 LZ 压缩器。建议在部署前使用 test_fc 工具在代表性数据集上进行基准测试。

  4. 监控计数器:fc 提供了 fc_enc_mode_winsfc_enc_mode_time_ns 等原子计数器,可用于分析哪些编解码器在你的数据上表现最佳,进而指导后续优化。

局限与未来方向

fc 目前仅支持 x86-64 架构,缺乏 ARM/NEON 路径,这限制了其在边缘计算和移动设备上的应用。此外,压缩格式尚未稳定,不同版本之间可能存在不兼容性,不建议将 fc 压缩数据作为长期归档格式。

尽管如此,fc 在浮点流压缩领域提供了一个优秀的工程参考:通过语义感知的数据分块、特征驱动的模式选择、以及底层 SIMD 优化,实现了压缩比与解码速度的良好平衡。对于需要高效存储科学计算结果或时序指标数据的系统而言,fc 是一个值得评估的选项。


资料来源

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com