lzma 压缩比显著高于 gzip 和 zipfile(DEFLATE),尤其适合文本、日志等高冗余数据,但速度慢、内存占用高,且仅 Python 3.3+ 内置支持;追求最小体积时选用,实时或资源受限场景应规避。

为什么用 lzma 而不是 gzip 或 zipfile
lzma 的压缩比通常显著高于 gzip 和默认的 zipfile(基于 DEFLATE),尤其适合文本、日志、JSON、CSV 等冗余度高的数据。但它更慢、内存占用更高,且 Python 3.3+ 才内置支持。如果你追求体积最小化而非速度,lzma 是合理选择;但别在实时日志归档或低内存设备上无脑启用。
lzma.LZMACompressor 的关键参数怎么调才压得更小
压缩比主要由 preset 控制,它本质是预设的压缩策略组合(算法+字典大小+匹配查找深度等)。数值越高越慢但越小:
-
preset=0到9:0 最快最弱,9 最慢最强 -
preset=9并不总是比6小很多,但耗时可能翻倍 - 更细粒度控制需传入
filters字典,例如增大字典大小:filters = [{"id": lzma.FILTER_LZMA2, "dict_size": 67108864}](64MB 字典,需足够内存)
常见误操作:
- 直接用
lzma.compress(data)默认用preset=6,不够极致 - 忘记设置
format=lzma.FORMAT_XZ(尤其写 .xz 文件时) - 在小文件(<1MB)上硬套
preset=9,收益微乎其微,反而拖慢
写入 .xz 文件时必须注意的三个细节
lzma 模块原生支持 XZ 格式(比原始 LZMA 更通用),但容易出错:
- 文件必须以二进制模式打开:
open("out.xz", "wb"),不能用"w" - 推荐用
lzma.open()而非手动管理LZMACompressor:with lzma.open("data.xz", "wb", preset=9) as f: f.write(data) - 若要兼容其他工具(如命令行
xz),避免自定义filters,优先用preset;否则可能无法被xz -d正确解压
另外,lzma.open() 默认使用 FORMAT_XZ,而 FORMAT_ALONE(旧格式)已基本弃用,别混用。
解压失败常见报错和对应修复
遇到lzma.LZMAError: Invalid or unsupported options,大概率是:
- 压缩时用了非标准
filters,但解压端 Python 版本太低(<3.6 对某些 filter 支持不全) - 文件被截断或损坏,可用
lzma.is_check_supported(lzma.CHECK_CRC64)验证校验类型是否被当前环境支持 - 用
gzip或zipfile尝试解压 .xz 文件——它们根本不认识 XZ 格式,必须用lzma.open()或命令行xz -d
真正影响落地的是:不同 Python 版本对 lzma 的底层 liblzma 绑定行为略有差异,生产环境务必在目标机器上实测压缩/解压全流程。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
压缩比高不等于“一定好”,字典大小拉到 128MB 可能吃光容器内存,而 preset=9 在 10MB 文件上多压出 50KB 却多花 3 秒——这些权衡点,得看你的数据特征和运行环境。
立即学习“Python免费学习笔记(深入)”;

















