Каков лучший алгоритм сжатия для маленьких файлов на 4 КБ?

Нет способа ответить на ваш вопрос, используя только предоставленную вами информацию. Это не плохо. Это очень хорошая вещь. В этом сила интерфейсов и самой основной возможности Spring - внедрение зависимостей. Идея, лежащая в основе обеих этих концепций, заключается в том, что ваш код и, возможно, даже программист ничего не знают о реализации конкретного интерфейса. Может быть несколько или несколько сотен уникальных реализаций этого интерфейса, и каждая из них означает, по крайней мере, немного другой ответ на ваш вопрос.

Еще один способ «ответить» на ваш вопрос - это сказать: «Реализация интерфейса, с которым вы взаимодействуете в вашем коде, определяется тем, какую конкретную реализацию этого интерфейса вы настроили для выполнения этой роли». [[ 112]

В случае Spring Boot ответ на ваш вопрос часто определяется зависимостями пакетов вашего приложения, обычно определяемыми через файл проекта Maven или Gradle. Вот, например, строки, которые вы бы добавили в определение проекта Gradle, чтобы Spring Boot реализовывал ваши операции CRUD с использованием JPA и MySQL:

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile("mysql:mysql-connector-java:5.1.13")

Если у вас есть работающее приложение, тогда ответ ваш вопрос, вероятно, определяется строками, похожими на эти в вашем файле Maven или Gradle или в эквивалентном определении вашего проекта для любого метода, который вы используете для его определения. Если у вас нет работающего приложения, то, возможно, вы еще даже не выбрали вспомогательную реализацию, и на ваш вопрос буквально нет ответа.

Если вы хотите получить более четкий ответ, почему бы вам не опубликовать более подробную информацию о вашем приложении, например о коде, и, что более важно, файл проекта Maven или Gradel.

12
задан Peter Mortensen 9 September 2011 в 14:59
поделиться

8 ответов

Choose the algorithm that is the quickest, since you probably care about doing this in real time. Generally for smaller blocks of data, the algorithms compress about the same (give or take a few bytes) mostly because the algorithms need to transmit the dictionary or Huffman trees in addition to the payload.

I highly recommend Deflate (used by zlib and Zip) for a number of reasons. The algorithm is quite fast, well tested, BSD licensed, and is the only compression required to be supported by Zip (as per the infozip Appnote). Aside from the basics, when it determines that the compression is larger than the decompressed size, there's a STORE mode which only adds 5 bytes for every block of data (max block is 64k bytes). Aside from the STORE mode, Deflate supports two different types of Huffman tables (or dictionaries): dynamic and fixed. A dynamic table means the Huffman tree is transmitted as part of the compressed data and is the most flexible (for varying types of nonrandom data). The advantage of a fixed table is that the table is known by all decoders and thus doesn't need to be contained in the compressed stream. The decompression (or Inflate) code is relatively easy. I've written both Java and Javascript versions based directly off of zlib and they perform rather well.

The other compression algorithms mentioned have their merits. I prefer Deflate because of its runtime performance on both the compression step and particularly in decompression step.

A point of clarification: Zip is not a compression type, it is a container. For doing packet compression, I would bypass Zip and just use the deflate/inflate APIs provided by zlib.

13
ответ дан 2 December 2019 в 07:22
поделиться

Мне повезло, что я использовал библиотеки сжатия zlib напрямую и не использовал никаких файловых контейнеров. У ZIP, RAR есть накладные расходы на хранение таких вещей, как имена файлов. Я видел, как сжатие таким образом дает положительные результаты (сжатие меньше исходного размера) для пакетов размером до 200 байт.

1
ответ дан 2 December 2019 в 07:22
поделиться

С ZLIB все должно быть в порядке. Он используется в MCCP.

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

1
ответ дан 2 December 2019 в 07:22
поделиться

Я не думаю, что размер файла имеет значение - если я правильно помню, LZW в GIF сбрасывает свой словарь каждые 4K .

1
ответ дан 2 December 2019 в 07:22
поделиться

Все эти алгоритмы разумно попробовать. Как вы говорите, они не оптимизированы для крошечных файлов, но ваш следующий шаг - просто попробуйте их. Скорее всего, потребуется всего 10 минут, чтобы протестировать и сжать некоторые типичные пакеты и посмотреть, какие размеры получаются. (Попробуйте разные флаги сжатия). Из полученных файлов вы, вероятно, сможете выбрать, какой инструмент работает лучше всего.

Все перечисленные кандидаты являются хорошими первыми попытками. Вы также можете попробовать bzip2.

Иногда простое «попробуй их все» - хорошее решение, когда тесты легко выполнить ... слишком много думать иногда замедляет тебя.

2
ответ дан 2 December 2019 в 07:22
поделиться

Вы можете попробовать дельта-сжатие. Сжатие будет зависеть от ваших данных. Если у вас есть какая-либо инкапсуляция полезной нагрузки, то вы можете сжать заголовки.

0
ответ дан 2 December 2019 в 07:22
поделиться

Если вы хотите "сжать TCP-пакеты", вы можете рассмотреть возможность использования стандартной техники RFC.

  • RFC1978 Протокол сжатия PPP Predictor
  • RFC2394 Сжатие полезной нагрузки IP с использованием DEFLATE
  • RFC2395 Сжатие полезной нагрузки IP с использованием LZS
  • RFC3173 Протокол сжатия полезной нагрузки IP (IPComp)
  • RFC3051 Сжатие полезной нагрузки IP с использованием ITU-T V.44.
  • RFC5172 Negotiation for IPv6 Datagram Compression Using IPv6 Control Protocol
  • RFC5112 The Presence-Specific Static Dictionary for Signaling Compression (Sigcomp)
  • RFC3284 The VCDIFF Generic Differencing and Compression Data Format
  • RFC2118 Microsoft Point-To-Point Compression (MPPC) Protocol

Возможно, есть и другие важные RFC, которые я упустил из виду.

5
ответ дан 2 December 2019 в 07:22
поделиться

Я сделал то, что предложил Арно Сетагая в своем ответе: сделал несколько выборочных тестов и сравнил результаты.

Тесты сжатия были выполнены с использованием 5 файлов, каждый из которых по 4096 байт. Каждый байт внутри этих 5 файлов был сгенерирован случайным образом.

ВАЖНО: В реальной жизни данные, скорее всего, не будут случайными, но, как правило, будут содержать немного повторяющихся байтов. Таким образом, в реальных приложениях сжатие будет иметь тенденцию быть немного лучше, чем следующие результаты.

ПРИМЕЧАНИЕ. Каждый из 5 файлов был сжат сам по себе (т.е. не вместе с другими 4 файлами, что привело бы к лучшему сжатию) , В следующих результатах я просто использую сумму 5 файлов вместе для простоты.

Я включил RAR только для сравнения, хотя это не открытый исходный код.

Результаты: (от лучшего к худшему)

LZOP: 20775/20480 * 100 = 101,44% от исходного размера

RAR: 20825/20480 * 100 = 101,68% от исходного размера

LZMA: 20827/20480 * 100 = 101,69% от исходного размера

ZIP: 21020/20480 * 100 = 102,64% от исходного размера

BZIP: 22899/20480 * 100 = 111,81% от исходного размера

Вывод: на мой сюрприз ВСЕ из протестированных алгоритмов дали больший размер, чем оригиналы !!! Я думаю, что они хороши только для сжатия больших файлов или файлов, которые имеют много повторяющихся байтов (не случайные данные, как указано выше). Таким образом, я не буду использовать какой-либо тип сжатия для моих пакетов TCP. Возможно, эта информация будет полезна для других, которые рассматривают сжатие небольших фрагментов данных.

РЕДАКТИРОВАТЬ: Я думаю, что они хороши только для сжатия больших файлов или файлов, которые имеют много повторяющихся байтов (не случайные данные, как указано выше). Таким образом, я не буду использовать какой-либо тип сжатия для моих пакетов TCP. Возможно, эта информация будет полезна для других, которые рассматривают сжатие небольших фрагментов данных.

РЕДАКТИРОВАТЬ: Я думаю, что они хороши только для сжатия больших файлов или файлов, которые имеют много повторяющихся байтов (не случайные данные, как указано выше). Таким образом, я не буду использовать какой-либо тип сжатия для моих пакетов TCP. Возможно, эта информация будет полезна для других, которые рассматривают сжатие небольших фрагментов данных.

РЕДАКТИРОВАТЬ: Я забыл упомянуть, что я использовал параметры (флаги) по умолчанию для каждого из алгоритмов.

-3
ответ дан 2 December 2019 в 07:22
поделиться