Zstd: ZSTD_c_targetCBlockSize == ZSTD_TARGETCBLOCKSIZE_MAX leva a uma compressão improvávelmente ruim

Criado em 28 abr. 2020  ·  3Comentários  ·  Fonte: facebook/zstd

Usar ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_targetCBlockSize, ZSTD_TARGETCBLOCKSIZE_MAX) leva a uma compressão improvável para fontes com sequências mínimas grandes (> 1kB).

Usando uma concatenação repetida de um CSS reduzido:
Com a configuração targetCBlockSize == ZSTD_TARGETBLOCKSIZE_MAX:
bootstrap.min.css : 97.31% (13862462 => 13488900 bytes, bootstrap.min.css.zst)
Sem definir targetCBlockSize:
bootstrap.min.css : 0.15% (13862462 => 20476 bytes, bootstrap.min.css.zst)

Observação adicional: encontrei isso como resultado da tentativa de reduzir o tamanho do bloco na descompactação em relação ao # 2093. Se, em vez de definir o TargetCompressedBlockSize, o próprio ZSTD_BLOCKSIZEMAX for reduzido, fazendo com que o tamanho máximo do bloco também seja reduzido, ele terá um impacto muito menor na compressão.


A fonte utilizada foi obtida através da seguinte sequência:
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

Comentários muito úteis

@dciliske Eu reproduzi o problema no nível 22. Ele não está presente no zstd-1.4.4, portanto, nunca foi lançado. Parece que apresentei em https://github.com/facebook/zstd/pull/1947. Vou consertar isso em breve.

Todos 3 comentários

Vou fazer uma pergunta aqui com relação à arquitetura: targetCBlockSize faz com que o compressor presuma que será alimentado em um descompressor que não terá nenhum conhecimento fora do bloco que recebe? ou seja, é um descompressor de streaming totalmente sem buffer?

targetCBlockSize "destina-se" a ser usado em cenários de streaming onde você deseja reduzir o tempo para descompactar o primeiro byte. Portanto, se o tamanho do seu pacote é de 4 KB, você pode definir o tamanho do bloco de destino para 4 KB e tentar tornar cada pacote descompressível, em vez de ter que esperar 128 KB completos antes de descompactar o primeiro byte.

Não tenho certeza do que está acontecendo neste cenário, mas com a entrada deve ser fácil de reproduzir e corrigir. Vou investigar isso em breve. Obrigado novamente pelo relatório e as instruções detalhadas de reprodução!

@dciliske Eu reproduzi o problema no nível 22. Ele não está presente no zstd-1.4.4, portanto, nunca foi lançado. Parece que apresentei em https://github.com/facebook/zstd/pull/1947. Vou consertar isso em breve.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

escalade picture escalade  ·  3Comentários

robert3005 picture robert3005  ·  4Comentários

itsnotvalid picture itsnotvalid  ·  3Comentários

indygreg picture indygreg  ·  3Comentários

AbdulrahmanAltabba picture AbdulrahmanAltabba  ·  3Comentários