LZMA
LZMA 常见于 xz/7z 生态,追求较高压缩率,代价是压缩速度和内存占用通常高于轻量算法。
核心思想
LZMA 使用大窗口字典匹配和范围编码,并通过上下文建模提升压缩率。
可以怎样理解它的内部流程
LZMA 的思路更偏“强模型”:
text
更深的匹配搜索 -> 更大的窗口 -> 更强的概率建模 -> 范围编码这也是它常常能拿到较高压缩率,但压缩端更慢、内存更高的原因。
工程取舍
| 维度 | 特点 |
|---|---|
| 压缩速度 | 通常较慢 |
| 解压速度 | 中等到较快 |
| 压缩率 | 很高 |
| 内存 | 可较高 |
| 流式 | liblzma 支持流式接口 |
常见工程特征
- 经常出现在
xz/7z这类偏归档生态中。 - 对窗口大小、字典大小、预设级别比较敏感。
- 更适合“写一次、读多次,但写可以慢”的任务。
适用场景
- 软件包发布
- 长期归档
- 对压缩率更敏感而非压缩速度的场景
调参时通常先看什么
- 预设级别:先决定压缩率与资源消耗的大致区间。
- 字典 / 窗口大小:越大通常越有利于长距离重复,但也更耗内存。
- 流式还是一次性 buffer API:取决于集成方式和数据规模。
使用时的常见坑
- 在内存受限环境下直接使用高预设,容易让体验失控。
- 把它用于极度延迟敏感路径,通常得不偿失。
- 只看压缩率,不看压缩时间,容易在 CI、构建链路、离线任务里造成明显拖慢。
C++ 示例
查看 LZMA C++ 示例。