shoco:快速的短字符串压缩库

shoco:快速的短字符串压缩库

shoco 是一个C语言实现的轻量级库,专注于快速压缩和解压短字符串。它以其速度易用性著称。默认的压缩模型针对英文单词进行了优化,但你也可以自定义压缩模型,使其基于你的特定输入数据。

shoco遵循MIT许可,完全免费。

快速上手

只需将 shoco.cshoco.hshoco_model.h 复制到你的项目中,并包含 shoco.h,就能立即使用API

API 使用

这是所有你需要的接口:

size_t shoco_compress(const char * in, size_t len, char * out, size_t bufsize);
size_t shoco_decompress(const char * in, size_t len, char * out, size_t bufsize);

如果 shoco_compresslen 参数为 0,则假设输入字符以空终止符结尾。如果它是一个正整数,解析将在该长度或第一个空终止符处停止。shoco_decompress 需要一个正整数(通常是 shoco_compress 返回值)作为 len 参数。

返回值是已写入的字节数。如果小于 bufsize,一切正常。在解压缩时,会写入一个空终止符。如果返回值正好等于 bufsize,则输出全部存在,但未被空终止符终止。是否视为错误取决于你自己的判断。如果输出缓冲区不够大,返回值将是 bufsize + 1。这时你可能需要分配一个更大的输出缓冲区。压缩后的字符串不会带有空终止符。

如果你确定输入数据是纯ASCII,那么 shoco_compress 的输出缓冲区大小可以与输入字符串相同。否则,对于如UTF-8这样的多字节或变宽编码输入,输出缓冲区可能需要是输入的两倍甚至更大。

对于标准配置的 shoco ,最大压缩率可以达到50%,因此,shoco_decompress 的输出缓冲区最多需要是压缩字符串大小的两倍。

工作原理

试过用 gzip 压缩 "hello world" 吗?现在我们来试试:

$ echo "hello world" | gzip -c | wc -c
32

你会发现,结果比原始字符串还要长。而 gzip 在处理短输入时已经做得相当不错了:xz 产生的输出长度为68字节。当然,这并不是它们设计用于处理的任务——除非你确实需要将小字符串变得更小。这就是 shoco 的诞生背景。

shoco 最擅长处理ASCII字符串。事实上,其最显著的特点是,只要输入是纯ASCII,压缩后的大小绝不会超过输入字符串。另外,ASCII字符串可以直接作为解压缩器的输入(将返回完全相同的字符串)。但是,如果输入字符串不是完全(或大部分)ASCII,输出可能会增大。特别是对于UTF-8这样的多字节编码,可能会增长很多。拉丁-1和其他类似的编码表现稍好,但如果遇到不常见的字符,仍然会导致输出大小增加。为什么会这样呢?

在任何语言中,有些字符的使用频率都高于其他字符。英语也不例外。所以如果列出最常见的前16个字符,只需要4位就可以表示它们(而ASCII使用8位,即一个字节)。但是,如果输入字符串包含了不在这个列表中的不常见字符怎么办?这里的关键在于:我们可以利用一个字符的第一个位来标记接下来的位是否代表常见字符的简短索引,或者是一个正常的ASCII字节。但是,如果字符不是ASCII(意味着输入字符的第一个位不是0),我们将插入一个标志,表示“按原样复制下一个字节”,然后就完成了。这就解释了非ASCII字符导致的输出增大的原因:这种标志占用了1个字节,使字符的有效大小翻倍。

实际上,shoco 如何标记这些打包的表示形式比这个描述稍微复杂一些(例如,还需要指定有多少个打包的字符跟随),但基本原理依然成立。

不过,shoco 比这更聪明一点:它基于之前字符提供常见字符的简短表示。因为某些字符在特定上下文出现的概率更高,比如在英语中,"q"几乎总是跟着"u";"the"、"she"、"he"、"then"都是非常常见的词,且都有一个"he"紧随其后。所以如果我们基于前面的常见字符建立一个常见字符的列表,可以使用更少的位来表示这些后续的字符,但仍能保持很高的匹配率。这就是shoco的工作原理:基于前后关系为字符提供简短的表示。

这种方法并不能实现最佳压缩。但通过精心对表示打包进行字节对齐,并使用上述的ASCII首个位技巧来编码索引,效果已经足够好了。此外,它的运行速度极快。对于一百字节以上的字符串,你可能就不会再考虑 shoco ,因为在那种情况下,全功能的压缩工具(如 gzip)的开销会被其高效的算法优势所掩盖。

如果要给 shoco 分类,它是一种熵编码器,因为它根据输入字符串中字符出现的概率来决定字符的表示长度。这与字典编码器相反,后者维护的是常用子串的字典。一个理想的短字符串压缩可能需要使用算术编码器(也是一种熵编码器),但也可能无法实现 shoco 提供的那种性能。

shoco 是如何获取字符频率信息的呢?不是凭空想象出来的,而是通过一个相对简单的脚本分析文本得到的。它计算所有连续字符(二元组)的频率,并按频率排序。如果需要,还可以测试最佳编码方式(比如:是在前导字符还是后继字符上花费更多位更好?),然后将结果输出为一个头文件供 shoco.c 包含。这意味着统计模型是编译进来的;如果没有正确的模型,我们就不能正确地解压缩数据,因此,你需要控制压缩和解压缩的两个端点,以确保模型的一致性。

生成压缩模型

也许你的典型输入不是英文单词。可能是德语或法语,或者是句子、文件系统路径或URL。虽然shoco的标准压缩模型应该适用于这些情况,但为特定类型的数据训练shoco可能会更有价值。

幸运的是,这很容易做到:shoco附带了一个Python脚本 generate_compression_model.py,可以接受一个或多个文本文件并输出供shoco使用的头文件。以下是一个示例,展示了如何用词典训练shoco(尽管这不是最佳的训练数据,因为它由不常见的单词主导):

$ ./generate_compression_model.py /usr/share/dict/words -o shoco_model.h

你可以选择如何切分和剥离输入数据——例如,如果我们想用README文件中的单词训练shoco,但去除标点符号和空白,可以这样做:

$ ./generate_compression_model.py --split=whitespace --strip=punctuation README.md

由于没有指定输出文件,生成的表文件将直接打印到stdout。

这通常是你生成良好模型所需的所有操作,但如果你愿意冒险,可以尝试玩转脚本的所有选项:输入generate_compression_model.py --help 获取友好的帮助信息。在这里就不详细介绍细节了,只提一句警告:如果输入数据很大,尤其是当你使用--optimize-encoding选项时,生成表格可能会很慢。使用pypy 可能会显著加速这一过程。

性能比较

smaz

另一个不错的短字符串压缩工具有 smazsmaz 看起来基于字典,而shoco 是熵编码器。因此,smaz 在压缩常见英文术语时常常胜过shoco。然而,对于不太常见的ASCII输入,shoco 通常优于smazsmaz 对于不常见的词(如数字)可能会使字符串变大,而shoco 从不会对ASCII字符串做这种事。


总的来说,shoco 是一个高效、灵活的解决方案,适用于那些需要快速处理大量短字符串的项目。无论你是处理多国语言文本,还是有特定领域词汇的需求,都可以考虑集成并定制 shoco 来提升性能。不妨试试看,看看它能否为你的项目带来惊喜!

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌芬维Maisie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值