Zstd: ZSTD_c_targetCBlockSize == ZSTD_TARGETCBLOCKSIZE_MAX führt zu einer unwahrscheinlich schlechten Komprimierung

Erstellt am 28. Apr. 2020  ·  3Kommentare  ·  Quelle: facebook/zstd

Die Verwendung von ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_targetCBlockSize, ZSTD_TARGETCBLOCKSIZE_MAX) führt zu einer unwahrscheinlich schlechten Komprimierung für Quellen mit großen Mindestsequenzen (> 1 KB).

Verwenden einer wiederholten Verkettung eines minimierten CSS:
Mit dem Setzen von targetCBlockSize == ZSTD_TARGETBLOCKSIZE_MAX:
bootstrap.min.css : 97.31% (13862462 => 13488900 bytes, bootstrap.min.css.zst)
Ohne targetCBlockSize zu setzen:
bootstrap.min.css : 0.15% (13862462 => 20476 bytes, bootstrap.min.css.zst)

Weiterer Hinweis: Ich bin darauf gestoßen, als ich versucht habe, die Blockgröße beim Dekomprimieren in Bezug auf # 2093 zu reduzieren. Wenn anstelle von TargetCompressedBlockSize ZSTD_BLOCKSIZEMAX selbst reduziert wird, was wiederum dazu führt, dass auch die maximale Blockgröße reduziert wird, hat dies einen viel geringeren Einfluss auf die Komprimierung.


Die verwendete Quelle wurde über die folgende Sequenz erhalten:
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

Hilfreichster Kommentar

@dciliske Ich habe das Problem auf Stufe 22 reproduziert. Es ist in zstd-1.4.4 nicht vorhanden, hat es also nie zu einer Veröffentlichung gemacht. Es sieht so aus, als hätte ich es in https://github.com/facebook/zstd/pull/1947 eingeführt. Ich werde es bald beheben.

Alle 3 Kommentare

Ich werde hier eine Frage zur Architektur stellen: Verursacht targetCBlockSize, dass der Kompressor davon ausgeht, dass er in einen Dekomprimierer eingespeist wird, der außerhalb des empfangenen Blocks keine Kenntnisse hat? dh es ist ein vollständig pufferloser Streaming-Dekomprimierer?

targetCBlockSize soll in Streaming-Szenarien verwendet werden, in denen Sie die Zeit zum Dekomprimieren des ersten Bytes verkürzen möchten. Wenn Ihre Paketgröße also 4 KB beträgt, können Sie Ihre Zielblockgröße auf 4 KB festlegen und versuchen, jedes Paket dekomprimierbar zu machen, anstatt auf volle 128 KB warten zu müssen, bevor Sie das erste Byte dekomprimieren.

Ich bin nicht sicher, was in diesem Szenario vor sich geht, aber mit der Eingabe sollte es einfach zu reproduzieren und zu reparieren sein. Ich werde es bald untersuchen. Nochmals vielen Dank für den Bericht und die ausführlichen Anweisungen zum Repro!

@dciliske Ich habe das Problem auf Stufe 22 reproduziert. Es ist in zstd-1.4.4 nicht vorhanden, hat es also nie zu einer Veröffentlichung gemacht. Es sieht so aus, als hätte ich es in https://github.com/facebook/zstd/pull/1947 eingeführt. Ich werde es bald beheben.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen