Featured image of post 各ファイル圧縮アルゴリズムの特性と性能の比較

各ファイル圧縮アルゴリズムの特性と性能の比較

初めに

お久しぶりです。在原です。

近年のコンテンツの最適化に圧縮技術は必須となっています。弊鯖においても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の圧縮に関する特性と分析

上記の画像の通り、各圧縮技術において圧縮率の差がほぼ出ない結果となりました。

そもそも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ファイルにおける圧縮比率の比較

wavファイルにおける圧縮時間のグラフ wavファイルにおける展開時間のグラフ

wavファイルにおける圧縮比率のグラフ

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ボイスバンクにおける圧縮時間比較 utauボイスバンクにおける展開時間比較

utauボイスバンクにおける圧縮比率

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のダンプファイルにおける展開時間のグラフ

DBのダンプファイルにおける圧縮比率のグラフ

ダンプファイルの圧縮に関する特性と分析

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の解析記事はどうしたん?

おすすめの曲