bzip3
要約
bzip3は、bzip2の後継となる新しい圧縮アルゴリズムです。より高い圧縮率とパフォーマンスを実現するため、高度なエントロピーコーダー、高速なBurrows-Wheeler変換、LZ77/PPMベースのRLEパスを採用しています。特にテキストやコードの圧縮に優れており、ベンチマークではxzやzstdと比較して優れた圧縮率を示す場合があります。
全文翻訳
BZip3
[画像: Build](https://github.com/iczelia/bzip3/actions/workflows/build.yml)
BZip2の、より優れ、より速く、より強力な精神的後継者です。オーダー0のコンテキスト混合エントロピーコーダー、サフィックス配列を活用した高速なBurrows-Wheeler変換コード、そしてLZ77スタイルの文字列マッチングとPPMスタイルのコンテキストモデリングに基づいたLZPパスを持つRLEにより、より高い圧縮率と優れたパフォーマンスを実現しています。
その祖先と同様に、BZip3はテキストやコードの圧縮に優れています。
インストール
# git clone を使用する場合(ソースパッケージには不要)、まず...
$ ./bootstrap.sh
# 全て...
$ ./configure
$ make
$ sudo make install
あるいは、システムのパッケージマネージャーを使用してbzip3をインストールできる場合があります。
macOSでは、Homebrewを使用して簡単にインストールできます。
$ brew install bzip3
Perlソースコードベンチマーク
まず、リリースされたすべてのPerl5のバージョンをダウンロードし、解凍しました。
% wget -r -l1 -nH --cut-dirs=2 --no-parent -A.tar.gz --no-directories https://www.cpan.org/src/5.0/
% for g in *.gz; do gunzip $g; done
% ls -la | wc -l
262
次に、結果の.tarファイルをすべて1つの.tarファイルにまとめ、さまざまな圧縮ツールで圧縮を試みました。
xz -T16 -9 -k all.tar 10829.91s user 26.91s system 1488% cpu 14658M memory 12:09.24 total
bzip2 -9 -k all.tar 981.78s user 9.77s system 95% cpu 8M memory 17:16.64 total
bzip3 -e -b 256 -j 12 all.tar 2713.81s user 16.28s system 634% cpu 18301M memory 7:10.10 total
bzip3 -e -b 511 -j 4 all.tar 17.65s user 12.19s system 170% cpu 12178M memory 7:08.65 total
zstd -T12 -16 all.tar 4162.94s user 16.40s system 1056% cpu 687M memory 6:35.62 total
結果は以下の通りです。
| Method | Compressed size (bytes) |
|---|---|
| LZMA (xz) | 2'056'645'240 |
| bzip2 | 3'441'163'911 |
| bzip3 -b 256 | 1'001'957'587 |
| bzip3 -b 511 | 546'456'978 |
| Zstandard | 3'076'143'660 |
最後に、壁時計時間での解凍時間(WD Blue HDD)です。
| Method | Decompression time |
|---|---|
| LZMA (xz) | 4min 40s |
| bzip2 | 9min 22s |
| bzip3 (parallel) | 4min 06s |
| Zstandard | 3min 51s |
次に、lrzipを使用して元の.tarファイルに対して長距離重複排除を実行しました。
% time lrzip -n -o all_none.tar.lrz all.tar
546.17s user 160.87s system 102% cpu 10970M memory 11:28.00 total
% time lrzip --lzma -o all_lzma.tar.lrz all.tar
702.16s user 161.87s system 122% cpu 10792M memory 11:44.83 total
% time lrzip -b -o all_bzip2.tar.lrz all.tar
563.93s user 147.38s system 112% cpu 10970M memory 10:34.10 total
最後に、結果のnone.tar.lrzファイルをbzip3で圧縮しました。
% time bzip3 -e -b 256 -j 2 all_none.tar.lrz
32.05s user 0.76s system 146% cpu 2751M memory 22.411 total
結果は以下の通りです。
| Method | Compressed size (bytes) |
|---|---|
| lrzip + bzip3 | 60'672'608 |
| lrzip + lzma | 64'774'202 |
| lrzip + bzip2 | 75'685'065 |
Turbo-Range-CoderやBSCとのさらなるベンチマークについては、powturboのベンチマークでbzip3、bzip2、bscなどを比較したものをご覧ください。
免責事項
本プログラム/ライブラリの使用に起因するいかなるデータの損失についても、その原因のいかんを問わず、一切の責任を負いません。
ファイルの圧縮は、圧縮されたファイルが元のファイルを再現できるように解凍できるという仮定に基づいています。このプログラムが正しく機能することを保証するために、設計、コーディング、およびテストにおいて多大な努力が払われています。
しかしながら、アルゴリズムの複雑さ、特に、非常に低い確率ではあるが存在するさまざまな特殊ケースのコードの存在により、プログラムにバグが残存する可能性を排除することはできません。
このプログラムにバグが残存する可能性(たとえそれがどれほど小さくても)を受け入れる準備ができていない限り、このプログラムでデータを圧縮しないでください。
これは、このプログラムが本質的に信頼できないという意味ではありません。実際、逆であることを強く願っています。Bzip3/libbz3は慎重に構築され、広範囲にテストされています。
Bzip3のパフォーマンスは、コンパイラに大きく依存します。x64 Linux clang13ビルドでは、通常、スレッドあたり最大17MiB/sの圧縮と23MiB/sの解凍が可能です。Windowsおよび32ビットビルドは、これよりかなり遅くなる可能性があります。
Bzip3は以下のアーキテクチャでテストされています。
- x86
- x86_64
- armv6
- armv7
- aarch64
- ppc64le
- mips
- mips64
- sparc
- s390x
コーパスベンチマーク
[画像: visualisation of the benchmarks]
詳細な結果については、etc/BENCHMARKS.mdを参照してください。
ライセンス
コンポーネントとそのライセンスの内訳は以下の通りです。
- (ランタイム) コードベース全体: Copyright 2022-2023, Kamila Szewczyk (k@iczelia.net); LGPL (LICENSE)
- (ランタイム) Burrows-Wheeler変換 (libsais) および LZPコード: 2021-2022, Ilya Grebnov (ilya.grebnov@gmail.com); Apache 2.0 (3rdparty/libsais-LICENSE)
- (コンパイル時)
build-aux: Copyright 2011, Daniel Richard G (skunk@iSKUNK.ORG), 2019, Marc Stevens (marc.stevens@cwi.nl), 2008, Steven G. Johnson (stevenj@alum.mit.edu); GPL-3+ with AutoConf exception - (コンパイル時)
build-aux/ax_check_compile_flag.m4: Copyright 2008, Guido U. Draheim (guidod@gmx.de), 2011, Maarten Bosmans (mkbosmans@gmail.com); FSFAP - (コンパイル時)
build-aux/git-version-gen: Copyright 2007-2012, Free Software Foundation, Inc; GPLv3 - (ランタイム)
bz3grep: Copyright 2003, Thomas Klausner; BSD-2-clause
bzip3全体はLGPLv3のみでライセンスされています。LGPLv3とApache 2.0のデュアルライセンスではありません。
謝辞
- Ilya Grebnov氏: BZip3のBWT構築に使用された
libsaisライブラリと、私が自己改善のための参照実装として使用したLZPエンコーダーを提供してくれたこと。 - Caleb Maclennan氏: BZip3のパッケージングフレンドリーなビルドシステムとしてautotoolsを設定してくれたこと。
- Ilya Muravyov氏: このプロジェクトで使用されている派生元である、彼のパブリックドメインのBWTポストコーダー。