Алгоритм сжатия для JSON-кодированных пакетов? - PullRequest
15 голосов
/ 28 декабря 2008

Какой алгоритм сжатия лучше всего использовать для сжатия пакетов перед их отправкой по сети? Пакеты кодируются с использованием JSON. Подойдет ли LZW для этого или есть что-то лучше?

Ответы [ 6 ]

9 голосов
/ 28 декабря 2008

Думаю, на ваш ответ повлияют два вопроса:

1) Насколько хорошо вы можете предсказать состав данных, не зная, что произойдет при каждом конкретном запуске программы? Например, если ваши пакеты выглядят так:

{
    "vector": {
        "latitude": 16,
        "longitude": 18,
        "altitude": 20
    },
    "vector": {
        "latitude": -8,
        "longitude": 13,
        "altitude": -5
    },
    [... et cetera ...]
}

- тогда вы, вероятно, получите лучшее сжатие, создав жестко закодированный словарь текстовых строк, которые будут отображаться в ваших данных, и заменять каждое вхождение одной из текстовых строк соответствующим индексом словаря. (На самом деле, если ваши данные это обычные, вы, вероятно, захотите отправить просто значения по проводу и просто написать функцию в клиент для создания объекта JSON из значения, если требуется объект JSON.)

Если вы не можете предсказать , какие заголовки будут использоваться, вам может понадобиться использовать LZW или LZ77, или другой метод, который просматривает данные, которые уже были пройдены, чтобы найти данные, которые он может выразить в особенно компактная форма. Однако ...

2) Нужно ли сжимать пакеты отдельно друг от друга? Если это так, то LZW определенно не метод, который вы хотите; у него не будет времени собрать свой словарь до размера, который даст существенные результаты сжатия к концу одного пакета. ИМХО, единственный шанс получить действительно существенное сжатие в этом сценарии - это использовать жестко закодированный словарь.

(Дополнение ко всему вышесказанному: как указывает Майкл Коне, отправка JSON означает, что вы, вероятно, отправляете весь текст, что означает, что вы используете слишком низкую пропускную способность, что позволяет отправлять гораздо более широкий диапазон символов, чем вы. Тем не менее, проблема упаковки символов, попадающих в диапазон 0-127, в контейнеры, содержащие значения 0-255, довольно проста, и я думаю, что ее можно оставить как «упражнение для читателя», как они говорят .)

5 голосов
/ 30 августа 2011

Существует еще два алгоритма сжатия JSON: CJson & HPack HPack делает очень хорошую работу, сравнимую со сжатием gzip.

2 голосов
/ 25 сентября 2011

Вот краткий тест на сжимаемость данных JSON оригинал: crime-data_geojson.json 72844By (Вы можете получить файл здесь: https://github.com/lsauer/Data-Hub. Файл был выбран случайным образом, но не может представлять средние данные JSON)

кроме zip все параметры архиватора были установлены на ультра

* cm/ nanozip: 
  > 4076/72844
  [1] 0.05595519
* gzip:
  > 6611/72844
  [1] 0.09075559
* LZMA / 7zip
  > 5864/72844
  [1] 0.0805008
* Huffman / zip:
  > 7382/72844
  [1] 0.1013398
* ?/Arc:
  > 4739/72844
  [1] 0.06505683

Это означает, что сжатие очень высокое и выгодное. Данные JSON обычно имеют высокую энтропию. Согласно википедии

Скорость энтропии английского текста составляет от 1,0 до 1,5 бит на буква, [1] или всего от 0,6 до 1,3 бит на букву, в соответствии с оценки Шеннона, основанные на экспериментах на людях

Энтропия данных JSON часто намного выше этого. (В эксперименте с 10 произвольными файлами JSON примерно одинакового размера я вычислил 2,36)

2 голосов
/ 28 декабря 2008

Позвольте веб-серверу сжиматься, а браузер - исходному; gzip или deflate.

2 голосов
/ 28 декабря 2008

Ммм ... Поправьте меня, если я ошибаюсь, но если вы используете сжатие по проводам, то вы контролируете оба конца соединения, верно? В этом случае, если JSON слишком толстый протокол, почему бы вам просто не выбрать другой проводной протокол, который не такой толстый? Я имею в виду, что я понимаю привлекательность использования такого стандарта, как JSON, но если вас беспокоит пропускная способность, вам, вероятно, следует выбрать проводной протокол, который не весь текст.

0 голосов
/ 07 мая 2009

Gzip (алгоритм deflate) довольно хорошо справляется со сжатием, хотя, как и все хорошие алгоритмы сжатия, использует большое количество процессоров (в 3-5 раз больше, чем издержки на чтение / запись json в моем тестировании).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...