Zstd: ZSTD_c_targetCBlockSize == ZSTD_TARGETCBLOCKSIZE_MAX приводит к невероятно плохому сжатию

Созданный на 28 апр. 2020  ·  3Комментарии  ·  Источник: facebook/zstd

Использование ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_targetCBlockSize, ZSTD_TARGETCBLOCKSIZE_MAX) приводит к невероятно плохому сжатию для источников с большими минимальными последовательностями (> 1 КБ).

Используя повторную конкатенацию минифицированного CSS:
С установкой targetCBlockSize == ZSTD_TARGETBLOCKSIZE_MAX:
bootstrap.min.css : 97.31% (13862462 => 13488900 bytes, bootstrap.min.css.zst)
Без установки targetCBlockSize:
bootstrap.min.css : 0.15% (13862462 => 20476 bytes, bootstrap.min.css.zst)

Дополнительное примечание: я столкнулся с этим в результате попытки уменьшить размер блока при распаковке относительно # 2093. Если вместо установки TargetCompressedBlockSize уменьшается сам ZSTD_BLOCKSIZEMAX, что, в свою очередь, приводит к уменьшению максимального размера блока, это оказывает гораздо меньшее влияние на сжатие.


Использованный источник был получен в следующей последовательности:
rm bootstrap.min.css; wget https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css && for i in {1..5}; do cat bootstrap.min.css >> bootstrap_2.min.css; cat bootstrap_2.min.css >> bootstrap.min.css; done && rm bootstrap_2.min.css

bug release-blocking

Самый полезный комментарий

@dciliske Я воспроизвел проблему на уровне 22. Ее нет в zstd-1.4.4, поэтому она так и не попала в релиз. Похоже, я представил его в https://github.com/facebook/zstd/pull/1947. Скоро исправлю.

Все 3 Комментарий

Я собираюсь задать вопрос об архитектуре: заставляет ли targetCBlockSize компрессор предполагать, что он будет загружен в декомпрессор, который не будет иметь никаких знаний за пределами блока, который он получает? т.е. это полностью безбуферный потоковый декомпрессор?

targetCBlockSize «предназначен» для использования в сценариях потоковой передачи, в которых вы хотите сократить время распаковки первого байта. Поэтому, если размер вашего пакета составляет 4 КБ, вы можете установить размер целевого блока на 4 КБ и попытаться сделать каждый пакет распаковываемым, вместо того, чтобы ждать полных 128 КБ перед распаковкой первого байта.

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

@dciliske Я воспроизвел проблему на уровне 22. Ее нет в zstd-1.4.4, поэтому она так и не попала в релиз. Похоже, я представил его в https://github.com/facebook/zstd/pull/1947. Скоро исправлю.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

itsnotvalid picture itsnotvalid  ·  3Комментарии

rgdoliveira picture rgdoliveira  ·  3Комментарии

planet36 picture planet36  ·  3Комментарии

ghost picture ghost  ·  4Комментарии

terrelln picture terrelln  ·  3Комментарии