扩展库/snappy
snappy
压缩归档v1.0.0C 混编0 依赖ABI 1
Snappy 高速压缩 — Google 开发,以速度为首要目标(目标 250 MB/s+),格式兼容 Google Snappy,适合大数据管道与实时处理。本库为干净室纯 C 实现(Snappy 格式兼容 1.0.0),xlang 层提供二进制安全(统一 Buffer)、易用的 API:一次性内存压缩、文件级压缩、以及 update → drain → finish 增量流式处理。
典型场景
大数据管道实时流压缩缓存压缩RPC 载荷日志压缩进度回显传输
快速开始
quick_start.xl
import snappy
func main(...) as int
Buffer packed = snappy.compress("hello snappy")
println(snappy.decompressText(packed)) // hello snappy
auto enc = snappy.compressor()
enc.update("part1 ")
enc.update("part2")
enc.finish()
Buffer blob = enc.drain()
auto dec = snappy.decompressor()
dec.update(blob)
dec.finish()
println(dec.drain().text()) // part1 part2
return 0
end核心特性
- 极速 — 以速度为首要目标,吞吐可达 250 MB/s 以上
- 格式兼容 — 产出格式与 Google Snappy 互通
- 二进制安全 — 输入输出统一
Buffer - 三种粒度 — 一次性内存、文件级、增量流式(
SnappyCompressor/SnappyDecompressor) - 真流式输出 —
drain()随时取走已产出字节 - 进度回显 —
inputBytes/outputBytes字节计数器 - 多成员流 — 解压器
finished/members - 文件原子写 — 临时文件 + 原子重命名
包信息
| 包名 | snappy |
|---|---|
| 版本 | 1.0.0 |
| 引擎 | 纯 C Snappy 格式兼容实现 1.0.0 |
| 实现方式 | C 混编(Snappy 引擎 C,API 层 xlang) |
| 依赖 | 无 |
| ABI 版本 | 1 |
| 导出符号 | compress(), decompress(), decompressText(), compressFile(), decompressFile(), compressor(), decompressor(), SnappyCompressor, SnappyDecompressor |
| 源文件 | extlibs/snappy/src/snappy.xl |
一次性 / 文件 / 流式
export func compress(Buffer data, ...) as Buffer
export func decompress(Buffer data, ...) as Buffer
export func compressFile(...) / decompressFile(...)
export func compressor(...) as SnappyCompressor
export func decompressor(...) as SnappyDecompressor
API 结构与 zstd 一致:一次性、文件级、增量流式三粒度。流式类提供 update/drain/finish + inputBytes/outputBytes/finished/members。
文件接口末尾支持可空
onProgress(inputBytes, totalBytes, outputBytes)。返回 false 删除临时输出并抛 CancelledError;回调异常原样传播。C 层对应 xrtprogressproc + void* userData。Snappy 为固定策略算法,无级别/质量参数,因此也不导出调优常量;数据损坏抛
CompressionError。教学范例
完整源文件:examples/extlibs/snappy.xl
1. 一次性 + 流式
snappy.xl
import snappy
Buffer packed = snappy.compress("xlang snappy")
assert snappy.decompressText(packed) == "xlang snappy"
println("引擎版本: ", snappy.version())
auto encoder = snappy.compressor()
Buffer streamPacked = Buffer()
encoder.update("hello ")
streamPacked.append(encoder.drain())
encoder.update("stream")
streamPacked.append(encoder.drain())
encoder.finish()
streamPacked.append(encoder.drain())
auto decoder = snappy.decompressor()
decoder.update(streamPacked)
decoder.finish()
assert decoder.drain().text() == "hello stream"2. 高冗余数据压缩率
压缩率
Buffer redundant = Buffer()
int i = 0
while i < 256
redundant.append("snappy-snappy-")
i = i + 1
end
Buffer packed = snappy.compress(redundant)
println(redundant.size(), " -> ", packed.size(), " 字节") // 3584 -> 202
assert snappy.decompress(packed) == redundant运行范例
终端
cd release xl.exe run examples\extlibs\snappy.xl
测试覆盖
测试文件:test/cases/extlib_snappy.xl、test/cases/extlib_snappy_progress.xl
- 一次性二进制往返(含 NUL / 0xFF)
- 流式往返 + members 计数
- 分块收集 + inputBytes 计数器 + finished
- 高冗余数据压缩后显著更小
- 串联多成员流
- 损坏数据抛 CompressionError
- 文件级往返 + overwrite 拒绝
运行测试
终端
cd release xl.exe run ..\test\cases\extlib_snappy.xl