lzo压缩算法和codec

这几天和一个同学看看将lzo引入SR. 我本来觉得应该是挺简单的事情,因为之前apache/orc下面就有个lzo实现,可能port过来就好了。谁知道这个实现和hadoop lzocodec差别还挺大的,最后这个同学不知道从哪里了解到了hadoop lzocodec的实现,搞成C++代码 https://github.com/StarRocks/starrocks/pull/20251/files

看这个PR里面,原来hadoop lzocodec在lzo压缩算法的基础上,还做了许多包装工作,包括增加了header, block, 以及针对每个block做了checksum. 只有block内部是使用lzo1x压缩算法的。

其实我在调试C++ lzo + pylzo的实现也发现了这个问题:库可能并不会直接使用raw stream, 可能会在上面继续包装一层存储某些元信息,组成成为一套文件格式。比如pylzo就会可选地增加header出来,https://github.com/jd-boyd/python-lzo/blob/master/lzomodule.c#L259.


在看 lzo 仓库的时候发现下面有许多算法实现,一眼看过去还不太清楚之间的差别

Pasted-Image-20231225103306.png

后来知道lzo1b_8.c 表示: 1b类型的算法,压缩级别为8的实现。目前大概有下面几种实现,下面是chatgpt给的回答: