如何在Python中压缩短英文字符串?
我想在内存中存放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 个回答
你可以试试使用标准库里的 zipfile。
英语字符串中最多只有128个不同的字符。因此,你可以用7位二进制代码来表示每一个字符。想了解更多,可以查看这个链接:压缩UTF-8(或其他8位编码)到7位或更少
我不想把字典和每个字符串都存一起,因为那样会占用太多空间。
所以可以把所有需要的内容放在一个字符串里,然后一次性压缩,这样也能解决“头部太大”的问题。
你可以用多种方法来做到这一点。最简单的可能是创建一个字符串列表的 repr()
;或者你也可以使用 pickle
、shelve
或 json
模块来生成其他类型的序列化格式。