Сжатие небольшой части данных

У меня есть буфер, скажем, 4 КБ, содержащий данные в JSON-подобном формате. Мне нужно добавить к нему значительно больше информации (скажем, в 3 раза больше), но я должен вписаться в этот небольшой кусок памяти. Я думал об использовании libZ для сжатия текста, но боюсь, что он не будет работать хорошо, поскольку данные состоят в основном из нескольких уникальных подстрок. Что бы вы порекомендовали в этой ситуации? Спасибо Крис

2 ответа

Решение

Рассмотрим фиксированный словарь, содержащий до 32 тыс. Строк, которые, как вы ожидаете, появятся в ваших данных. Вы бы использовали ZlibdeflateSetDictionary() а также inflateSetDictionary() на каждом конце (отправитель и получатель данных соответственно) с одним и тем же словарем на обоих концах. Это может дать вам сжатие, которое вы ищете. Без словаря вы вряд ли получите такое сжатие с таким небольшим количеством данных.

Если вы действительно хотите придерживаться сжатия, алгоритм сжатия, использующий пользовательский словарь, который использует конкретную структуру ваших данных, будет работать лучше всего. Я реализовал нечто подобное с помощью SharpZipLib.

Если вы хотите сохранить больше данных в буфере и не использовать сжатие текстоподобных данных, рассмотрите двоичный протокол, такой как Google Protocol Buffers.

Обновить

Ответ @Mark описывает, как использовать пользовательский словарь с zlib.

Другие вопросы по тегам