我想要适合80M长度的字符串<内存中有20个字符,使用尽可能少的内存。
我想要一个可以从Python驱动的压缩库,这将允许我压缩短(<20 char)英文字符串。我有大约80M的它们,我希望它们尽可能少地记忆。
我想最大程度的无损压缩。 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 header = 200字节。我没有进行双重检查,但我知道它大于20。)< / p>
霍夫曼编码听起来不错,除非是基于个别令牌,不能做ngrams(多个字符)。
smaz有一本糟糕的字典,只压缩到50%。
我更喜欢使用现有代码,而不是实现压缩算法。
答案 0 :(得分:1)
制作所有单词的字典。然后,将所有单词转换为与字典中的偏移量对应的数字。如果需要,您可以使用第一位来指示该单词是大写的。
答案 1 :(得分:1)
如何使用标准库中的zipfile?
答案 2 :(得分:1)
英文字符串中不超过128个不同的字符。因此,您可以使用7位代码描述每个字符。见Compressing UTF-8(or other 8-bit encoding) to 7 or fewer bits
答案 3 :(得分:1)
首先,如果单独压缩每个20字节的字符串,压缩率将会很低。你需要压缩很多字符串才能真正见证一些切实的好处。
其次,80M字符串很多,如果你必须将它们全部解压缩以提取它们中的一个,你就会对性能感到不满。将您的输入组合成较小但仍然足够大的块。典型值为64KB,转换为3200个字符串。
然后,您可以独立压缩每个64KB块。当您需要访问块中的单个字符串时,您需要解码整个块。
所以在这里,需要权衡压缩比(更喜欢较大的块)和随机访问速度(更喜欢较小的块)。你将成为选择最佳人选的法官。
快速说明:内存结构上的随机访问通常有利于快速压缩算法,而不是强力算法。如果您只压缩一次,但随机访问很多次,请选择一些高度不对称的算法,例如LZ4-HC: http://code.google.com/p/lz4hc/
根据基准测试,压缩速度仅为15MB / s,但解码速度约为1GB / s。这意味着每秒64K块的64KB解码......