Чтобы улучшить сжатие gzip, вы хотите, чтобы «похожие» строки были в списке близкими. Есть несколько способов определить такое сходство; позвольте мне описать разумный, который хорошо работает на практике. Напомним, что размер блока gzip составляет 64 КБ. Таким образом, ваши данные будут разбиты на блоки размером 64 КБ, и каждый блок будет сжат независимо. Чтобы оптимизировать сжатие, необходимо минимизировать количество отдельных k-мер (подстрок размера k) в каждом блоке. Мотивация заключается в том, что все такие подстроки будут заменены идентификатором.
Хотя вышеупомянутая проблема сложна в теории (это вариант разбиения гиперграфа), существуют быстрые практические алгоритмы. Я бы порекомендовал LSH-подобную кластеризацию, которая может быть реализована за один проход ваших данных. Обратите внимание, что (в алфавитном порядке) сортировка является еще одним способом «кластеризовать» похожие строки вместе. Однако специализированные алгоритмы кластеризации могут работать лучше.
Альтернативой является использование zstd , которое (i) быстрее, (ii) получает более высокие коэффициенты сжатия и (iii) не имеет ограничений на размер блока (и, таким образом, сжимает строки одинаково хорошо независимо от порядка ввода).