Использование API сжатия

Многие приложения должны использовать сжатие данных без потери и распаковку. API сжатия упрощает это путем предоставления алгоритмов сжатия Windows через общедоступный API. Каждый алгоритм сжатия имеет набор свойств, которые управляют его поведением. API сжатия предоставляет интерфейс, позволяющий разработчику задавать или запрашивать значения этих свойств. Все свойства для поддерживаемых алгоритмов сжатия имеют значения по умолчанию, представляющие часто используемые значения этих свойств. Если для сжатия и декомпрессии требуется свойство, значения по умолчанию будут одинаковыми, обеспечивая использование идентичных значений для сжатия и декомпрессии.

Выбор алгоритма сжатия

После того как разработчик решит, что приложению необходимо сжать или распаковать данные, следующим шагом является выбор алгоритма сжатия. Это может зависеть от тестов, чтобы найти оптимальное сочетание скорости, сжатия и требования к памяти для конкретного приложения. В следующем списке приведено относительное сравнение алгоритмов сжатия, поддерживаемых API сжатия. Не каждый вариант доступен для каждого алгоритма сжатия, и сравнение приблизительно, так как производительность может зависеть от входных данных.

XPRESS (COMPRESS_ALGORITHM_XPRESS)

  • Очень быстро с низкими требованиями к ресурсам
  • Средний коэффициент сжатия
  • Высокая скорость сжатия и распаковки
  • Требование к низкой памяти
  • Поддерживает параметр COMPRESS_INFORMATION_CLASS_LEVEL, доступный в перечислении COMPRESS_INFORMATION_CLASS. Значение по умолчанию — DWORD)0. Для некоторых данных значение (DWORD)1 может улучшить коэффициент сжатия с немного более медленной скоростью сжатия.

XPRESS с кодировкой Huffman (COMPRESS_ALGORITHM_XPRESS_HUFF)

  • Коэффициент сжатия выше COMPRESS_ALGORITHM_XPRESS
  • Средний коэффициент сжатия
  • Средняя до высокой скорости сжатия и распаковки
  • Требование к низкой памяти
  • Поддерживает параметр COMPRESS_INFORMATION_CLASS_LEVEL в перечислении COMPRESS_INFORMATION_CLASS. Значение по умолчанию — DWORD)0. Для некоторых данных значение (DWORD)1 может улучшить коэффициент сжатия с немного более медленной скоростью сжатия.

MSZIP (COMPRESS_ALGORITHM_MSZIP)

  • Использует больше ресурсов, чем COMPRESS_ALGORITHM_XPRESS_HUFF
  • Создает сжатый блок, аналогичный RFC 1951.
  • Средний и высокий коэффициент сжатия
  • Средняя скорость сжатия и высокая скорость декомпрессии
  • Требование к средней памяти

LZMS (COMPRESS_ALGORITHM_LZMS)

  • Хороший алгоритм, если размер сжатых данных превышает 2 МБ.
  • Высокий коэффициент сжатия
  • Низкая скорость сжатия и высокая скорость декомпрессии
  • Требование к средней и высокой памяти
  • Поддерживает параметр COMPRESS_INFORMATION_CLASS_BLOCK_SIZE в перечислении COMPRESS_INFORMATION_CLASS. Рекомендуется получить минимальный размер 1 МБ для повышения коэффициента сжатия.

Выбор используемого режима API сжатия

После того как разработчик выбирает алгоритм сжатия, следующее решение состоит из двух режимов API сжатия, которые следует использовать: режим буфера или режим блокировки. Режим буфера был разработан для удобства использования и рекомендуется в большинстве случаев.

Режим буфера автоматически разбивает входной буфер на блоки размера, подходящего для выбранного алгоритма сжатия. Режим буфера автоматически форматирует и сохраняет несжатый размер буфера в сжатом буфере. Размер сжатого буфера не сохраняется автоматически, и приложение должно сохранить его для распаковки. Не включайте флаг COMPRESS_RAW в параметр Алгоритма при вызове CreateCompressor и CreateDecompressor для использования режима буфера. Пример кода приложения режима буфера см . в разделе "Использование API сжатия" в разделе "Режим буфера".

Режим блокировки позволяет разработчику управлять размером блока, но требуется больше работы, выполняемой приложением. При использовании режима блокировки приложение должен разбить входные данные на соответствующие размеры при сжатии, а затем поместить фрагменты вместе при распаковки. Режим блока завершается ошибкой, если размер входного буфера превышает размер внутреннего блока алгоритма сжатия. Размер внутреннего блока составляет 32 КБ для MSZIP и 1 ГБ для алгоритмов сжатия XPRESS. Размер внутреннего блока для LZMS можно настроить до 64 ГБ с соответствующим увеличением использования памяти. Размер сжатого буфера не сохраняется автоматически, а приложение также должно сохранить его для декомпрессии. Значение параметра UncompressedBufferSize decompress должно быть точно равно исходному размеру несжатых данных, а не только размеру выходного буфера. Это означает, что приложение должно сохранить точный исходный размер несжатых данных, а также сжатые данные и сжатый размер при использовании режима блокировки. Включите флаг COMPRESS_RAW в параметр Алгоритма при вызове CreateCompressor и CreateDecompressor для использования режима блокировки. Пример кода приложения режима блокировки см . в разделе "Использование API сжатия" в разделе "Режим блокировки".

Выделение пользовательской памяти

Приложения в режиме буфера и блока имеют возможность указать настраиваемую подпрограмму выделения памяти при вызове CreateCompressor и CreateDecompressor. Параметр AllocationRoutines указывает структуру COMPRESS_ALLOCATION_ROUTINES , содержащую подпрограмму выделения памяти. Затем приложение может задать размер блока для компрессора с помощью SetCompressorInformation. Пример простой настраиваемой подпрограммы выделения см. в разделе "Использование API сжатия в режиме блокировки".