
2026/06/23 3:17
悪魔的に遅いレベル 13 のデフレーション圧縮
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
主要なメッセージは、DEFLATE コンプレッションレベル 13 は、日常利用ではなく、その極めて高い CPU コストのためのものであり、ファイルサイズ削減の絶対的な限界を示すために設計された高度に最適化され、理論的に優れた機能であるという点です。実用的な標準とは異なり、このレベルは 32 KiB のフルデータウィンドウを検索すること、ハフマンコードを複数回のパスで精緻化すること、および複雑な統計サンプリングとパススコリングを使用してブロック分割の判断を遅らせることなどを通じて理論的な最適化を優先しています。Silesia コーパスでのテストがその有効性を検証しており、レベル 12 の強力な基準線と比較してファイルが肥大化するもの一つも出さずに 86,990 バイト(0.134%)の節減を実現し、厳格な零回帰ポリシーに従いました。この高度な設定はテキストのようなデータに対して特定の利点を生み、HTTP、ZIP、PNG などの普遍的なデコード形式にも利益をもたらしますが、処理速度は大幅に低下します(レベル 12 と比較して最大 56.4 倍も遅い)。本質的には、レベル 13 は広く使用されている DEFLATE デコーダに変更を必要とせず、実用的なユーザーにはレベル 12 の堅牢な標準を残しつつ、技術的な境界を示し、パフォーマンスの上限を引き出すためのニッチツールとして位置づけられています。
本文
libdeflate レベル 13:超高圧縮設定の解説とベンチマーク結果
概要
レベル 13 は、意図的に実用性から乖離した libdeflate の特殊な圧縮設定 です。標準的な出力形式を維持しつつ、計算リソースに対して大幅に時間を費やす設計となっています。
- サイズ削減: Silesia データセットでは、レベル 12 に比べ約 0.134%(86,990 バイト)の削減。
- 所要時間: レベル 12 と比較すると、56.4 倍もの増加が発生します。
- 適正な利用シーン: データを一度圧縮して多数のクライアントに配布するような、計算コストが許容される環境でのみ推奨されます。
なぜ DEFLATE を最適化する必要があるのか?
DEFLATE(LZ77 アルゴリズムとハフマン符号化)は HTTP コンテンツ符号化、ZIP、PNG 等形式で広く採用されており、デコーダーとの互換性契約が固まっています。しかし、以下のエンコーダー側における設計自由度があり、ここでの最適化が可能です。
- マッチングの選択: どこまで探索するか
- ブロック境界の設定: ブロック分割位置の決定
- ハフマンテーブルの設計: 符号化効率の向上
これらを高度に最適化することで、互換性を損なわずに出力サイズを縮小できます。今回の実装は、基盤となる「レベル 12」(すでに強力な実用的エンコーダー)へのプルリクエストとして提出されました。
レベル 13 の仕組み
レベル 13 は、パースアルゴリズムのほぼ最適化を維持しつつ、意思決定のプロセスを意図的にコスト高くしています。具体的な技術的な変更点は以下の通りです。
1. 探索範囲とハフマン最適化
- 検索窓: DEFLATE ウィンドウ全体の 32KiB を検索します。
- 最適化パス: 最大で 15 回の最適化パスを実行します。
- 静的ハフマン適用: 入力データが 50,000 バイト以下のブロックに対してのみ、静的なハフマン最適化を適用します(形式拡張なし)。
2. ブロックサイズ決定の遅延(文字列向け)
特定のデータパターンにおいて、ブロックサイズの決定プロセスを遅らせてより大きなブロックを検出します。
- トリガー条件:
- カンマ位置から最大 64KiB をサンプリング。
- NULL バイトが含まれていない場合。
- 異なるバイト値が 97 種類以下の場合。
- アクション: ブロックサイズをデフォルトの 300,000 バイトから 1,000,000 バイトへ引き上げます。
- ※安定したバイト分布がある場合、一つのハフマンテーブルでより多くのデータをカバーできる仮説に基づいています。
3. パースアルゴリズムのコスト推定強化
- コスト探索の拡大: 各マッチング長に対して最も費用対効果の高いオフセットを選択します。
- 初期コスト推定: 文字リテラルとマッチング長の統計から、初期的なハフマンコストを推定します。
- 動的比較評価: キャッシュされたマッチ情報からオフセットスロットの使用頻度を推定し、以下の手法との比較評価を行います。
- 静的ハフマン符号化
- 「リテラルのみ」の符号化法
4. ブロック分割決定の遅延
ブロックをどこで分割するかについても、探索とスコアリングを遅らせてより良い判定を行います。
- 候補保持: パース状態と共に最大 9 つの分割候補を保持します。
- 最短経路探索: 全ブロックおよび候補間隔に対する有界な最短経路探索を行ってスコアリングします。
- 採用条件:
- 単一の分割がコスト面で優位であれば採用。
- 複数回の分割を含むパスにおいては、全ブロックに比べて少なくとも 512 ビットのコスト改善が必要です。
- キャッシュ: 最終的に選択されたパース結果はキャッシュされ、フラッシュ処理時に使用されます。
5. 制御不能への防衛線(キャップ)
探索パスの数、分割候補の数、ブロックサイズなどに**上限(キャップ)**を設けています。これにより、「turtledeflate」や ECT などのファイル全体最適化ツールに見られるような、制御不能な最適化ループに陥ることはありません。
レグレスジョン(性能劣化)対策ポリシー
開発プロセスにおいて、以下の「ゼロ圧縮レグレッション方針」を遵守しました。
- 基本方針: Silesia コーパス上で実施された変更は、少なくとも一つの圧縮済みファイルのサイズが確実に小さくなった一方で、他のすべてのファイルのサイズが増大しないことを条件としています。
- データセットの特性: Silesia コーパスは多岐にわたるデータ(テキスト、バイナリ、DB、画像等)を混在させる反復開発に適しており、単一ファイルへの過剰チューニングに対して厳しく罰する性質を持っています。
Silesia データセットでのベンチマーク結果
libdeflate レベル 12 とレベル 13 の比較結果です。
ベンチマーク表
| ファイル名 | レベル 12 サイズ / 時間 | レベル 13 サイズ / 時間 | サイズ差 (削減率) | 時間差 (増加率) |
|---|---|---|---|---|
| dickens | 3,688,552 B / 1,289 ms | 3,684,671 B / 83,512 ms | -0.105% | +6,378.8% |
| mozilla | 18,267,490 B / 4,959 ms | 18,235,120 B / 110,754 ms | -0.177% | +2,133.4% |
| mr | 3,448,571 B / 1,627 ms | 3,443,723 B / 16,260 ms | -0.141% | +899.4% |
| nci | 2,766,224 B / 7,935 ms | 2,758,044 B / 673,648 ms | -0.296% | +8,389.6% |
| ooffice | 2,998,130 B / 424 ms | 2,995,604 B / 8,676 ms | -0.084% | +1,946.2% |
| osdb | 3,642,347 B / 798 ms | 3,641,341 B / 4,942 ms | -0.028% | +519.3% |
| reymont | 1,702,796 B / 1,005 ms | 1,699,494 B / 81,839 ms | -0.194% | +8,043.2% |
| samba | 5,135,662 B / 2,889 ms | 5,122,812 B / 141,227 ms | -0.250% | +4,788.4% |
| sao | 5,255,575 B / 333 ms | 5,255,358 B / 1,687 ms | -0.004% | +406.6% |
| webster | 11,565,754 B / 6,452 ms | 11,555,293 B / 475,196 ms | -0.090% | +7,265.1% |
| x-ray | 5,754,248 B / 305 ms | 5,748,141 B / 3,276 ms | -0.106% | +974.1% |
| xml | 633,760 B / 1,104 ms | 632,518 B / 69,504 ms | -0.196% | +6,195.7% |
| 合計 | 64,859,109 B / 29,120 ms | 64,772,119 B / 1,670,521 ms | -0.134% | +5,636.7% |
結果の要約
- 全体削減: コーパス全体で **86,990 バイト(約 0.134%)**の削減に成功しました。
- 時間コスト: 合計所要時間は 1,641,401 ミリ秒増加しています。
- 個別性能:
- **最適化が最も有効だったのは「nci」**で、0.296% の削減を実現しました。
- **変化が最小だったのは「sao」**であり、わずか 0.004% の削減でした。