初めに
お久しぶりです。在原です。
近年のコンテンツの最適化に圧縮技術は必須となっています。弊鯖においてもDBのダンプファイルなどを圧縮技術(.gzip)を用いて圧縮しております。
古くから広く用いられているgzipやxzの他にも近年はzstdやbrotli等といった新進気鋭の圧縮技術が生まれているいます。その中で、各アルゴリズムの圧縮、展開特性のベンチマークを行い圧縮技術の利用方法におけるベストプラクティスを見つけていくことを目的に本記事をまとめていきます。
同じような利用方法を模索している方々の参考になれば幸いです。
圧縮アルゴリズム
ベンチマークで用いた圧縮アルゴリズムの一覧。アルゴリズムにおける技術概要に関しては各自調べてください。
| アルゴリズム | バージョン情報 |
|---|---|
| gzip | gzip 1.12 |
| zstd | Zstandard CLI v1.5.5 (64-bit) |
| xz | XZ Utils 5.4.5 |
| bzip2 | bzip2 1.0.8 (2019-07-13) |
| lz4 | LZ4 CLI v1.9.4 (64-bit) |
| lzop | lzop 1.04 |
| brotli | brotli 1.1.0 |
| lzma | LZMA command line tool 9.22 |
| lzip | lzip 1.24.1 |
| 7z | 7-Zip 23.01 (x64) |
| zip | Info-ZIP (1990–2008) |
各ソフトウェアのdefault、High、Lowの圧縮比率で分析を行っていきます。
また、どの方式においてもシングルスレッドで計測を行っております
下の表は今回の計測で用いる圧縮オプションです。
今回のベンチマークに用いたスクリプトでは引数に-L,-Hを指定すると下記の表にあるオプションを付けて実行します。
| Algorithm | Low (-L) | High (-H) | Default |
|---|---|---|---|
| gzip | -1 | -9 | (none) |
| zlib | -1 | -9 | (none) |
| zip | -1 | -9 | (none) |
| bzip2 | -1 | -9 | (none) |
| lzma | -1 | -9 | (none) |
| lzip | -1 | -9 | (none) |
| lzop | -1 | -9 | (none) |
| zstd | –fast | -19 | -3 |
| xz | -0 | -9e | -6 |
| 7z | -mx1 | -mx9 | -mx5 |
| brotli | -q 0 | -q 11 | -q 6 |
なお、作成したスクリプトに関してgithb上に公開しています
https://github.com/ariwara-narihira/compression-benchmark-scr/tree/main
比較対象
本ベンチマークで用いるデータの紹介をします。
単独のmp3ファイル
- バンブータイガー/宮舞モカ
- 320kbps
- 6.97 MB (7,315,132 B)
単独のwavファイル
- 掌面説/yowanecity Feat.初音ミク
- 1411kbps
- 25.3 MB (26,530,160 B)
UTAU音源ライブラリー
- 路音ラウ(仮)の音源データ
- files : 188
- 250 MB (262,381,367 B)
- voices : 1442
データベースのダンプファイル
- makibisskey.workのバックアップデータ
- sql形式
- 24.8 GB (26,720,771,624 B)
計測環境
- Operating System: Ubuntu 24.04.2 LTS
- Kernel: Linux 6.8.0-53-generic
- Architecture: x86-64
- Hardware Vendor: QEMU
- CPU(s): 2
- Model name: QEMU Virtual CPU version 2.5+
上記の環境で検証を行いました。環境によってはタイムなどに差が出ると思うので参考程度に見てください。
ベンチマーク結果
単独のmp3ファイル
default
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 7315132 | 7245641 | 99.00% | 0.271750436 | 0.067210391 |
| zstd | 7315132 | 7298214 | 99.00% | 0.066995971 | 0.019831671 |
| xz | 7315132 | 7271896 | 99.00% | 2.853988579 | 0.44508964 |
| bzip2 | 7315132 | 7278074 | 99.00% | 0.930051086 | 0.704195687 |
| lz4 | 7315132 | 7315155 | 100.00% | 0.025299171 | 0.01403543 |
| lzop | 7315132 | 7301522 | 99.00% | 0.021301719 | 0.013548483 |
| brotli | 7315132 | 7303729 | 99.00% | 0.191626269 | 0.026807453 |
| lzma | 7315132 | 7270089 | 99.00% | 3.08788546 | 0.787691997 |
| lzip | 7315132 | 7269790 | 99.00% | 2.655979092 | 0.432690796 |
| 7z | 7315132 | 7271839 | 99.00% | 0.619073608 | 0.382891438 |
| zip | 7315132 | 7245782 | 99.00% | 0.247088777 | 0.062322144 |
High (-H)
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 7315132 | 7245506 | 99.00% | 0.28043643 | 0.068525682 |
| zstd | 7315132 | 7243204 | 99.00% | 1.662833514 | 0.022535921 |
| xz | 7315132 | 7271896 | 99.00% | 2.201716609 | 0.428609064 |
| bzip2 | 7315132 | 7278074 | 99.00% | 0.74712655 | 0.429801701 |
| lz4 | 7315132 | 7315155 | 100.00% | 0.022613919 | 0.013254518 |
| lzop | 7315132 | 7297152 | 99.00% | 0.547433982 | 0.016185761 |
| brotli | 7315132 | 7196458 | 98.00% | 19.47365131 | 0.088615547 |
| lzma | 7315132 | 7270093 | 99.00% | 2.710152125 | 0.801291839 |
| lzip | 7315132 | 7269713 | 99.00% | 2.691797063 | 0.447588575 |
| 7z | 7315132 | 7271786 | 99.00% | 0.684470214 | 0.396392815 |
| zip | 7315132 | 7245647 | 99.00% | 0.25084597 | 0.062951279 |
Low (-L)
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 7315132 | 7253731 | 99.00% | 0.247562147 | 0.065493399 |
| zstd | 7315132 | 7298341 | 99.00% | 0.025945762 | 0.016361988 |
| xz | 7315132 | 7295572 | 99.00% | 1.57318259 | 0.07182247 |
| bzip2 | 7315132 | 7304535 | 99.00% | 0.746436109 | 0.381259121 |
| lz4 | 7315132 | 7315155 | 100.00% | 0.024225499 | 0.015709559 |
| lzop | 7315132 | 7301522 | 99.00% | 0.021314089 | 0.016415604 |
| brotli | 7315132 | 7290361 | 99.00% | 0.035959912 | 0.050340587 |
| lzma | 7315132 | 7291369 | 99.00% | 1.76368187 | 0.822245763 |
| lzip | 7315132 | 7279521 | 99.00% | 3.071234856 | 0.453422796 |
| 7z | 7315132 | 7289631 | 99.00% | 0.80675489 | 0.112709123 |
| zip | 7315132 | 7253872 | 99.00% | 0.250436499 | 0.069766192 |
グラフ

mp3の圧縮に関する特性と分析
上記の画像の通り、各圧縮技術において圧縮率の差がほぼ出ない結果となりました。
そもそもmp3自体が不可逆圧縮のファイルのため、単体での圧縮が難しい。ただその中でもblotliの圧縮が非常に高く出た。それ以外は誤差みたいなもん。
単独のwavファイル
default
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 26530160 | 25086593 | 94.00% | 0.884685477 | 0.212445719 |
| zstd | 26530160 | 25328753 | 95.00% | 0.077789749 | 0.032445065 |
| xz | 26530160 | 24755188 | 93.00% | 9.904443423 | 1.612263764 |
| bzip2 | 26530160 | 25072008 | 94.00% | 2.650693054 | 1.531737973 |
| lz4 | 26530160 | 25601973 | 96.00% | 0.053825229 | 0.037715141 |
| lzop | 26530160 | 25585881 | 96.00% | 0.055442888 | 0.038120964 |
| brotli | 26530160 | 25058689 | 94.00% | 0.788432092 | 0.203872233 |
| lzma | 26530160 | 24744397 | 93.00% | 12.78384287 | 2.687401227 |
| lzip | 26530160 | 24784375 | 93.00% | 13.47395695 | 1.595459676 |
| 7z | 26530160 | 24788073 | 93.00% | 3.527626286 | 1.451388243 |
| zip | 26530160 | 25086730 | 94.00% | 0.92683313 | 0.220528127 |
High
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 26530160 | 25081892 | 94.00% | 1.541846597 | 0.210477906 |
| zstd | 26530160 | 25258533 | 95.00% | 7.5060974 | 0.05411172 |
| xz | 26530160 | 24784024 | 93.00% | 10.96616418 | 1.645705163 |
| bzip2 | 26530160 | 25072008 | 94.00% | 2.98627417 | 2.114618105 |
| lz4 | 26530160 | 25601973 | 96.00% | 0.053978353 | 0.047545799 |
| lzop | 26530160 | 25466095 | 95.00% | 2.986455322 | 0.051010047 |
| brotli | 26530160 | 24076047 | 90.00% | 87.14445333 | 0.295103451 |
| lzma | 26530160 | 24780607 | 93.00% | 11.60122597 | 2.675100792 |
| lzip | 26530160 | 24782257 | 93.00% | 9.76755969 | 1.50530437 |
| 7z | 26530160 | 24787855 | 93.00% | 2.387359873 | 1.35983696 |
| zip | 26530160 | 25082029 | 94.00% | 1.473204452 | 0.206669988 |
Low
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 26530160 | 25132750 | 94.00% | 0.791904051 | 0.221042152 |
| zstd | 26530160 | 25480724 | 96.00% | 0.044647719 | 0.029827467 |
| xz | 26530160 | 24977172 | 94.00% | 4.131476109 | 1.571019923 |
| bzip2 | 26530160 | 25264141 | 95.00% | 2.515842433 | 1.304019524 |
| lz4 | 26530160 | 25601973 | 96.00% | 0.056349621 | 0.047531498 |
| lzop | 26530160 | 25585990 | 96.00% | 0.057692305 | 0.045767473 |
| brotli | 26530160 | 25458829 | 95.00% | 0.060371517 | 0.06781439 |
| lzma | 26530160 | 24858816 | 93.00% | 6.614747222 | 2.782777739 |
| lzip | 26530160 | 24820238 | 93.00% | 10.66956534 | 1.528150832 |
| 7z | 26530160 | 24896234 | 93.00% | 2.071694012 | 0.720977822 |
| zip | 26530160 | 25132887 | 94.00% | 0.792001231 | 0.225261844 |
グラフ



wavの圧縮に関する特性と分析
こちらも、mp3と同じく、どのアルゴリズムにおいてもほぼ結果は変わらない。
サイズが小さいファイルはzstdではなく、gzipなどを用いたほうが効率的な場合があることがわかりました。
UTAU音源のライブラリー
default
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 263301120 | 236890514 | 89.00% | 9.93051968 | 2.049744668 |
| zstd | 263301120 | 237992074 | 90.00% | 1.660874004 | 0.528942172 |
| xz | 263301120 | 220473012 | 83.00% | 123.138202 | 9.158741677 |
| bzip2 | 263301120 | 221637461 | 84.00% | 26.3557307 | 22.20726074 |
| lz4 | 263301120 | 253660789 | 96.00% | 0.570879067 | 0.41015271 |
| lzop | 263301120 | 254667447 | 96.00% | 0.678901095 | 0.36664427 |
| brotli | 263301120 | 235868560 | 89.00% | 22.18105663 | 1.188033821 |
| lzma | 263301120 | 221412935 | 84.00% | 164.665607 | 24.56881395 |
| lzip | 263301120 | 221504605 | 84.00% | 146.3637514 | 13.61956516 |
| 7z | 263301120 | 219440631 | 83.00% | 45.33564975 | 7.633697459 |
| zip | 263301120 | 236890651 | 89.00% | 9.390234778 | 2.122090942 |
High
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 263301120 | 236869168 | 89.00% | 10.24033277 | 1.928096826 |
| zstd | 263301120 | 231106799 | 87.00% | 107.8027737 | 0.750865164 |
| xz | 263301120 | 218303200 | 82.00% | 184.8572066 | 8.55586465 |
| bzip2 | 263301120 | 221637461 | 84.00% | 26.0326892 | 18.11346613 |
| lz4 | 263301120 | 253660789 | 96.00% | 0.579749333 | 0.453388673 |
| lzop | 263301120 | 246518808 | 93.00% | 24.29845355 | 0.54235244 |
| brotli | 263301120 | 219565635 | 83.00% | 752.4705028 | 2.00333786 |
| lzma | 263301120 | 219657897 | 83.00% | 189.4527262 | 24.8406254 |
| lzip | 263301120 | 219595134 | 83.00% | 171.8877704 | 13.75721136 |
| 7z | 263301120 | 218141822 | 82.00% | 90.60759382 | 7.757165961 |
| zip | 263301120 | 236869305 | 89.00% | 10.31212608 | 2.218336762 |
Low
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 263301120 | 236514681 | 89.00% | 8.020976378 | 2.14814418 |
| zstd | 263301120 | 252759466 | 95.00% | 0.480297946 | 0.456323087 |
| xz | 263301120 | 227176828 | 86.00% | 49.13777817 | 8.063342447 |
| bzip2 | 263301120 | 224020553 | 85.00% | 23.48737329 | 12.13243204 |
| lz4 | 263301120 | 253660789 | 96.00% | 0.524211564 | 0.33627716 |
| lzop | 263301120 | 254986230 | 96.00% | 0.511089792 | 0.305955334 |
| brotli | 263301120 | 244518544 | 92.00% | 0.892112439 | 1.232937683 |
| lzma | 263301120 | 229627176 | 87.00% | 59.80496876 | 25.52383075 |
| lzip | 263301120 | 224567476 | 85.00% | 85.9139518 | 13.92203377 |
| 7z | 263301120 | 229035887 | 86.00% | 20.932942 | 3.990419071 |
| zip | 263301120 | 236514818 | 89.00% | 7.686604142 | 2.265274178 |
グラフ



utauボイスバンクの圧縮に関する特性と分析
ボイスバンクのベンチマークテストを行った結果、UTAU のボイスバンクに関しては7zやXZが最も高い圧縮率を実現できることが明らかになりました。しかし、展開速度に関しては、これらの方式はいずれもzstdと比較して25倍以上の時間を要することもわかりました。
ユーザー体験の観点では、利用可能になるまでの準備時間というものが非常に重要です。そのため、圧縮率と展開速度のバランスを考慮すると、zstdの最高設定で圧縮する方式が最も実用的であると判断できます。
DBのダンプファイル
default
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 26720771624 | 8503950133 | 31.00% | 847.5920342 | 173.4805496 |
| zstd | 26720771624 | 7319960645 | 27.00% | 175.7518581 | 46.12574897 |
| xz | 26720771624 | 5150405748 | 19.00% | 12751.81428 | 369.2629798 |
| bzip2 | 26720771624 | 6393882482 | 23.00% | 2491.562242 | 1110.139646 |
| lz4 | 26720771624 | 12476252573 | 46.00% | 93.3226664 | 36.9966518 |
| lzop | 26720771624 | 12643037975 | 47.00% | 119.5514633 | 67.91999617 |
| brotli | 26720771624 | 5987506768 | 22.00% | 1935.883591 | 86.06886274 |
| lzma | 26720771624 | 5067427052 | 18.00% | 27019.40582 | 621.6688977 |
| lzip | 26720771624 | 5279586396 | 19.00% | 12824.25079 | 407.6366433 |
| 7z | 26720771624 | 5196550166 | 19.00% | 8262.643898 | 344.619951 |
| zip | 26720771624 | 8503950389 | 31.00% | 869.4761049 | 202.9922068 |
High
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 26720771624 | 8376100207 | 31.00% | 1912.422469 | 173.5299585 |
| zstd | 26720771624 | 5354044834 | 20.00% | 18579.67047 | 53.77841201 |
| xz | 26720771624 | 4640177252 | 17.00% | 25150.70547 | 347.2517857 |
| bzip2 | 26720771624 | 6393882482 | 23.00% | 2480.985763 | 1025.307487 |
| lz4 | 26720771624 | 12476252573 | 46.00% | 89.05449388 | 38.93398141 |
| lzop | 26720771624 | 9566676798 | 35.00% | 3514.918198 | 74.07792094 |
| brotli | 26720771624 | 4913726205 | 18.00% | 63854.53401 | 92.40703327 |
| lzma | 26720771624 | 4763893305 | 17.00% | 33864.90065 | 586.2433357 |
| lzip | 26720771624 | 4753089887 | 17.00% | 23271.55026 | 383.0729245 |
| 7z | 26720771624 | 4763811170 | 17.00% | 11955.68563 | 318.9071314 |
| zip | 26720771624 | 8376100463 | 31.00% | 1854.945055 | 203.5124693 |
Low
| Algorithm | Original_Size | Compressed_Size | Ratio | Comp_Time(s) | Decomp_Time(s) |
|---|---|---|---|---|---|
| gzip | 26720771624 | 9648520069 | 36.00% | 411.1025915 | 186.7702099 |
| zstd | 26720771624 | 10670013781 | 39.00% | 88.67284372 | 34.67135079 |
| xz | 26720771624 | 7460816376 | 27.00% | 1595.732418 | 476.7662645 |
| bzip2 | 26720771624 | 7700455318 | 28.00% | 1997.392962 | 739.6829156 |
| lz4 | 26720771624 | 12476252573 | 46.00% | 90.24581875 | 39.68924609 |
| lzop | 26720771624 | 12772199616 | 47.00% | 110.6082934 | 71.27974832 |
| brotli | 26720771624 | 9409438925 | 35.00% | 124.8117874 | 92.96542515 |
| lzma | 26720771624 | 7562170016 | 28.00% | 2811.384403 | 859.6297522 |
| lzip | 26720771624 | 7022030728 | 26.00% | 2812.815909 | 476.046707 |
| 7z | 26720771624 | 7209815205 | 26.00% | 739.2336836 | 223.082318 |
| zip | 26720771624 | 9648520325 | 36.00% | 407.8342115 | 210.9773819 |
グラフ



ダンプファイルの圧縮に関する特性と分析
DB のダンプファイルを対象に圧縮アルゴリズムのベンチマークを行ったところ、いくつか興味深い傾向が見えてきました。
まずひとつ目に「DBのダンプファイルにおける圧縮率のグラフ」と「DBのダンプファイルにおける圧縮比率のグラフ」から、どの圧縮アルゴリズムも半分以下のサイズに圧縮できているという点が挙げられます。
次に、brotliは圧縮率こそXZに肉薄するものの、圧縮時間はXZの約3倍と掛かる特徴があります。一方で、展開速度はXZの約3分の1と非常に高速で、展開処理を重視した設計になっていることが分かります。
また、brotli・zstd・lz4 といった近年のアルゴリズムは、展開時間の高速化を強く意識して設計されている点も特徴的です。一般的に、圧縮技術はコンテンツの圧縮よりも展開のほうが利用される機会が多いため、クライアント側での展開速度を優先して最適化していると考えられます。特に brotli と zstd はWebコンテンツ圧縮でも広く利用されており、その設計思想がよく表れています。
zip・bzip2・gzipといった古い圧縮方式は、defaultと最高圧縮で圧縮比率にほとんど差がありません。そのため、これらのアルゴリズムでは高圧縮設定にしてもメリットが小さく、標準圧縮が最も効率的な選択になります。
さらに今回の比較では、zstdが最も圧縮レベルによる圧縮率の変化が大きいという結果も得られました。低圧縮ではgzipに近い圧縮率ですが、高圧縮ではXZに迫るレベルまで向上し、圧縮レベル調整による伸びしろが最も大きいアルゴリズムであることが分かります。
また、展開速度に注目するとzstdはどのアルゴリズムと比較しても頭ひとつ抜けて高速であることが分かります。 適度な圧縮率を維持しながら、展開が速いアルゴリズムは他にありません。 圧縮率・圧縮速度・展開速度のバランスを両立している点は、zstdの大きな強みだと言えます。
より高い圧縮率を求める場合はXZを選ぶのが定石ですが、7zの最高圧縮設定を用いると、zstdを上回る、 XZと同等の圧縮率を実現しつつ、圧縮・展開の両方でより高速に処理できる場合があります。7zがここまで強力に圧縮できる点は意外でした。
まとめ
- 展開速度、圧縮速度のバランスが一番いいのがzstd
- 圧縮時間や展開時間を無視し、より強力な圧縮を狙うなら7zがベスト
- とにかく不可逆圧縮された単体バイナリをより圧縮したい場合はbrotli。ただし、自分で圧縮、展開の環境を用意しないと駄目。
zstdが一番バランスの取れた結果になるんだろうと予想は付いていたのですが、7zも結構ありだな~となったのは意外でした。
弊環境では、肥大化するDBのバックアップデータをクラウドへアップロードする際、ISPの上り帯域制限やネットワーク負荷がボトルネックとなるため、条件に適した圧縮技術を選定する重要性が高まっています。 今回の実験により、今後さらに増大していくデータベースをより効率的に圧縮するための有用な知見を得ることができました。 これらの結果を踏まえ、今後のサーバー運用に積極的に活かしていきたいと考えています。
また、今後はマルチスレッドで処理が出来る圧縮アルゴリズムにおいて、どの方式がベストプラクティスとなるのか等といった調査も行っていきたいと思います。
一言
圧縮という身近に使われる技術の中に、それぞれの特徴があり、それらが顕著に出てくるという点が結構面白かった。特にベンチマークを取ることにより、各技術の特性をよく知ることができたので良かった。
ただし、ブログに書き起こしている際に飽きが来てしまい、まとめるのが苦痛になってしまった。
自分の飽き性には呆れてしまう。悪い点。
ってかT-potの解析記事はどうしたん?