Сжатие небольшой части данных
У меня есть буфер, скажем, 4 КБ, содержащий данные в JSON-подобном формате. Мне нужно добавить к нему значительно больше информации (скажем, в 3 раза больше), но я должен вписаться в этот небольшой кусок памяти. Я думал об использовании libZ для сжатия текста, но боюсь, что он не будет работать хорошо, поскольку данные состоят в основном из нескольких уникальных подстрок. Что бы вы порекомендовали в этой ситуации? Спасибо Крис
2 ответа
Рассмотрим фиксированный словарь, содержащий до 32 тыс. Строк, которые, как вы ожидаете, появятся в ваших данных. Вы бы использовали ZlibdeflateSetDictionary()
а также inflateSetDictionary()
на каждом конце (отправитель и получатель данных соответственно) с одним и тем же словарем на обоих концах. Это может дать вам сжатие, которое вы ищете. Без словаря вы вряд ли получите такое сжатие с таким небольшим количеством данных.
Если вы действительно хотите придерживаться сжатия, алгоритм сжатия, использующий пользовательский словарь, который использует конкретную структуру ваших данных, будет работать лучше всего. Я реализовал нечто подобное с помощью SharpZipLib.
Если вы хотите сохранить больше данных в буфере и не использовать сжатие текстоподобных данных, рассмотрите двоичный протокол, такой как Google Protocol Buffers.
Обновить
Ответ @Mark описывает, как использовать пользовательский словарь с zlib.