LZMA

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

LZMALempel-Ziv-Markov chain-Algorithmの略)は、2001年から開発されているデータ圧縮アルゴリズムで、7-Zipアーカイバの7zフォーマットで使用されている。LZMAは、LZ77に少々類似した辞書式圧縮法を使用し、通常bzip2以上の高い圧縮率と最大1GBまでの範囲でサイズ可変な圧縮辞書を特徴とする。

概要[編集]

LZMAは、改良LZ77圧縮アルゴリズムと、バックエンドにRange Coderを使用している。

データストリームの、反復配列の大きさと位置を別々に圧縮しているようである。

LZMA SDK[編集]

LZMAを圧縮・伸長するためのSDKが公開されている[1]。 ドキュメント、サンプル、ヘッダファイル、ソースコードなどを含む。 ライセンスはバージョン4.62以降パブリックドメインとなった。 C++ANSI-CC#Javaで実装されている。 伸長アルゴリズムは全ての32ビットCPUで実装可能であり、制約をつければ16ビットCPUでも実装可能である。

速度[編集]

  • 圧縮速度 - 1GHzのCPUで0.5MB/s
  • 伸長速度 - 1GHzのPentium 3で8~12MB/s。100MHzのARMで0.5~1MB/s。

7-Zipリファレンス実装[編集]

LZMAのリファレンス実装は、7z7-Zipツールセットの一部に含まれる。ソースコードは、GNU LGPLライセンスで配布されている。

オープンソースのリファレンス実装であるLZMA圧縮ライブラリは、 C++で記述されていて、以下の特性がある。

7-Zip実装には、ハッシュチェイン二分木基数木を辞書検索アルゴリズムの基礎とする、複数の変種がある。

LZMAの伸長専用コードはCで記述されていて、通常5kB前後にコンパイルされる。また、伸長に必要なRAMの量は、主に圧縮時のスライド窓の大きさによって決定する。小さいコードサイズと、辞書を小さくすることにより比較的少量になるメモリ消費量は、LZMA伸長アルゴリズムをアプリケーションに組み込むのに適するものとしている。

最近では、XZ Embeddedとして、特に組み込みシステム向けに特化されたライブラリが提供されている。これはLinuxカーネルに統合する事を目的としているが、独自のシステムにも容易に組み込みが可能である。

リファレンス実装の移植性[編集]

ソースコードには、広範囲でMicrosoft Windows特有の機能が使用され、しかも分離されていない。このため、リファレンス実装がフリーソフトウェアであるにもかかわらず、Unix互換用バージョンが登場するまでに時間がかかった。

現在、Unix系プラットホームで動く移植版が2つある:

  • p7zip、これは7-Zip7z7zaコマンドラインツールの移植版である。p7zipは、標準7zアーカイブストリームを生成する。これはLZMAに組み合せることができる追加フィルタで使用されている。フィルタは、たとえば、実行ファイルのジャンプやサブルーチン呼び出し命令の相対アドレス前処理などである。
  • LZMA Utils、これはLZMAコードだけからなる移植版である。これは生のLZMAストリームを、gzipbzip2圧縮ユーティリティと同様に扱えるように設計されている。lzmaツールで、.tarのように複数のファイルをアーカイブできる。出力は、ヘッダ情報のない生のLZMAである。現在ではXZ Utilsがメインストリームとなり、LZMA Utilsの開発は終息している。
  • XZ Embedded、XZ Utilsの伸張コードだけを抜き出して整理したライブラリで、主にLinuxカーネルのブート時に使用する前提で設計されている。但し、他の独自のシステムにも容易に移植可能となっている。

注意:7-ZipとLZMAで生成されるLZMAストリームは異なる。つまり非互換である。基本的に、一方のツールで生成したファイルはもう一方で扱うことはできない。ただし7-Zipはバージョン4.58でLZMAストリームの伸張をサポートした。7-Zipは非圧縮時のファイルサイズを含む64ビットヘッダエントリを付加するが、LZMA Utilsではこれがない。

関連ソフトウェア[編集]

LZMAを使用するか、サポートするソフトウェア。

外部リンク[編集]