Zstd: ZSTD_c_targetCBlockSize == ZSTD_TARGETCBLOCKSIZE_MAX mengarah ke kompresi yang tidak mungkin buruk

Dibuat pada 28 Apr 2020  ·  3Komentar  ·  Sumber: facebook/zstd

Menggunakan ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_targetCBlockSize, ZSTD_TARGETCBLOCKSIZE_MAX) mengarah ke kompresi yang sangat buruk untuk sumber dengan urutan minimum yang besar (> 1kB).

Menggunakan penggabungan berulang dari CSS yang diperkecil:
Dengan menyetel targetCBlockSize == ZSTD_TARGETBLOCKSIZE_MAX:
bootstrap.min.css : 97.31% (13862462 => 13488900 bytes, bootstrap.min.css.zst)
Tanpa menyetel targetCBlockSize:
bootstrap.min.css : 0.15% (13862462 => 20476 bytes, bootstrap.min.css.zst)

Catatan lebih lanjut: Saya mengalami ini sebagai akibat dari mencoba mengurangi ukuran blok pada dekompresi terkait # 2093. Jika alih-alih menyetel TargetCompressedBlockSize, ZSTD_BLOCKSIZEMAX itu sendiri berkurang, yang pada gilirannya menyebabkan ukuran blokir maksimum berkurang juga, itu memiliki dampak yang jauh lebih kecil pada kompresi.


Sumber yang digunakan diperoleh melalui urutan sebagai berikut:
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

Komentar yang paling membantu

@dciliske Saya telah mereproduksi masalah di level 22. Masalah ini tidak ada di zstd-1.4.4, jadi tidak pernah berhasil dirilis. Sepertinya saya memperkenalkannya di https://github.com/facebook/zstd/pull/1947. Saya akan segera memperbaikinya.

Semua 3 komentar

Saya akan mengajukan pertanyaan di sini mengenai arsitektur: apakah targetCBlockSize menyebabkan kompresor berasumsi bahwa itu akan dimasukkan ke dalam dekompresor yang tidak akan memiliki pengetahuan di luar blok yang diterimanya? yaitu itu adalah streaming decompressor bufferless sepenuhnya?

targetCBlockSize "dimaksudkan" untuk digunakan dalam skenario streaming di mana Anda ingin mengurangi waktu untuk mendekompresi byte pertama. Jadi, jika ukuran paket Anda 4 KB, Anda dapat menetapkan ukuran blok target Anda ke 4KB dan mencoba membuat setiap paket dapat didekompresi, daripada harus menunggu 128 KB penuh sebelum mendekompresi byte pertama.

Saya tidak yakin apa yang terjadi dalam skenario ini, tetapi dengan masukan seharusnya mudah untuk direproduksi dan diperbaiki. Saya akan segera memeriksanya. Sekali lagi terima kasih atas laporan dan detail instruksi repro!

@dciliske Saya telah mereproduksi masalah di level 22. Masalah ini tidak ada di zstd-1.4.4, jadi tidak pernah berhasil dirilis. Sepertinya saya memperkenalkannya di https://github.com/facebook/zstd/pull/1947. Saya akan segera memperbaikinya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

sergeevabc picture sergeevabc  ·  3Komentar

AbdulrahmanAltabba picture AbdulrahmanAltabba  ·  3Komentar

Hedda picture Hedda  ·  4Komentar

icebluey picture icebluey  ·  3Komentar

indygreg picture indygreg  ·  3Komentar