Я бы хотел разместить в памяти строки длиной 80M длиной <20 символов и использовать как можно меньше памяти. </p>
Мне нужна библиотека сжатия, которую я могу использовать из Python, которая позволит мне сжимать короткие (<20 символов) английские строки. У меня их около 80 миллионов, и я бы хотел, чтобы они занимали как можно меньше памяти. </p>
Я бы хотел максимальное сжатие без потерь. Процессорное время не является узким местом.
Я не хочу, чтобы словарь хранился с каждой строкой, потому что это потребовало бы больших затрат.
Я хочу сжать до <20% от исходного размера. Это правдоподобно, учитывая, что верхняя граница энтропии английского языка составляет 1,75 бита (Brown et al, 1992, <a href="http://acl.ldc.upenn.edu/J/J92/J92-1002.pdf" rel="nofollow">http://acl.ldc.upenn.edu/J/J92/J92-1002.pdf) = 22% сжатия (1,75 / 8).
Edit:
Я не могу использовать zlib, потому что заголовок слишком большой. (Если у меня есть строка, начинающаяся с 20 байтов, для хорошего сжатия заголовка НЕТ. Заголовок zlib = 200 байт согласно Роланду Иллингу. У меня нет двойной проверки, но я знаю, что она больше 20.)
Кодирование Хаффмана звучит хорошо, за исключением того, что оно основано на отдельных токенах и не может выполнять нграммы (несколько символов).
smaz имеет дерьмовый словарь и сжимает только до 50%.
Я настоятельно предпочитаю использовать существующий код, а не реализовывать алгоритм сжатия.