如何在Python中压缩短英文字符串?

1 投票
5 回答
1455 浏览
提问于 2025-04-17 05:50

我想在内存中存放8000万条长度小于20个字符的字符串,并且希望尽量少占用内存。

我需要一个可以通过Python调用的压缩库,能够压缩这些短的(小于20个字符)英文字符串。我大约有8000万条这样的字符串,希望它们能尽量占用更少的内存。

我希望能实现最大的无损压缩,CPU的处理时间不是问题。

我不想把字典和每个字符串一起存储,因为那样会占用太多空间。

我希望压缩后能小于原始大小的20%。这是可行的,因为根据研究,英文的熵上限是1.75比特(Brown等,1992年,http://acl.ldc.upenn.edu/J/J92/J92-1002.pdf),这意味着可以压缩到22%(1.75/8)。

补充说明:

我不能使用zlib,因为它的头部太大。(如果我有一个20字节的字符串,为了实现好的压缩,头部不能有任何内容。根据Roland Illing的说法,zlib的头部是200字节。我没有仔细检查过,但我知道它大于20字节。)

霍夫曼编码听起来不错,但它是基于单个符号的,不能处理多个字符的组合。

smaz的字典效果不好,压缩率只有50%。

我更倾向于使用现有的代码,而不是自己实现一个压缩算法。

5 个回答

1

你可以试试使用标准库里的 zipfile

1

英语字符串中最多只有128个不同的字符。因此,你可以用7位二进制代码来表示每一个字符。想了解更多,可以查看这个链接:压缩UTF-8(或其他8位编码)到7位或更少

2

我不想把字典和每个字符串都存一起,因为那样会占用太多空间。

所以可以把所有需要的内容放在一个字符串里,然后一次性压缩,这样也能解决“头部太大”的问题。

你可以用多种方法来做到这一点。最简单的可能是创建一个字符串列表的 repr();或者你也可以使用 pickleshelvejson 模块来生成其他类型的序列化格式。

撰写回答