LZMA

レンペル・ジヴ・マルコフ連鎖アルゴリズム[1]LZMA)は、ロスレスデータ圧縮を行うアルゴリズムです。 2001年から7-Zipアーカイバの7z形式で使用されています。[2]このアルゴリズムは、 1977年にアブラハム・レンペルヤコブ・ジヴによって発表されたLZ77アルゴリズムに似た辞書圧縮方式を使用しており、高い圧縮率(一般的にbzip2よりも高い)[3] [4]と可変の圧縮辞書サイズ(最大4GB  [ 5]を特徴としています。また、他の一般的な圧縮アルゴリズムと同等の解凍速度を維持しています。[6]

LZMA2は、非圧縮データとLZMAデータの両方を格納できるシンプルなコンテナフォーマットで、複数の異なるLZMAエンコードパラメータを持つことが可能です。LZMA2は、任意にスケーラブルなマルチスレッド圧縮・解凍機能と、部分的に圧縮不可能なデータの効率的な圧縮機能をサポートします。[7]

概要

LZMAは辞書圧縮アルゴリズム( LZ77の派生版で、巨大な辞書サイズと繰り返し使用される一致距離の特別なサポートを備えています)を使用し、その出力はレンジエンコーダでエンコードされます。レンジエンコーダは、複雑なモデルを用いて各ビットの確率予測を行います。辞書圧縮器は、高度な辞書データ構造を用いて一致箇所を見つけ、リテラルシンボルとフレーズ参照のストリームを生成します。このストリームはレンジエンコーダによって1ビットずつエンコードされます。多くのエンコード方法が可能であり、動的計画法アルゴリズムを用いて、一定の近似値の下で最適なエンコード方法が選択されます。[8]

LZMA以前のエンコーダモデルのほとんどは、純粋にバイトベースでした(つまり、各ビットを、同じバイトの前のビットへの依存関係を表すために、コンテキストのカスケードのみを使用して符号化していました)。LZMAの主な革新性は、一般的なバイトベースモデルではなく、リテラルまたはフレーズの各表現におけるビットフィールドに固有のコンテキストを使用する点です。これは一般的なバイトベースモデルとほぼ同じくらい単純ですが、無関係なビットが同じコンテキストに混在することを避けるため、はるかに優れた圧縮率を実現します。さらに、従来の辞書圧縮(zip形式やgzip形式で使用されるものなど)と比較して、辞書のサイズははるかに大きくすることができ、通常ははるかに大きくなります。これは、現代のシステムで利用可能な大量のメモリを活用しています。[8]

圧縮形式の概要

LZMA圧縮では、圧縮ストリームは適応型バイナリレンジコーダを用いて符号化されたビットストリームです。ストリームはパケットに分割され、各パケットは1バイト、または長さと距離が暗黙的または明示的に符号化されたLZ77シーケンスを記述します。各パケットの各部分は独立したコンテキストでモデル化されるため、各ビットの確率予測は、同じ種類の以前のパケットにおけるそのビットの値(および同じフィールドの関連ビット)と相関します。lzip [9]とLZMA SDKドキュメントの両方で、このストリーム形式について説明されています。[8]

パケットには7種類あります: [9]

パックコード(ビットシーケンス)パケット名パケットの説明
0 + バイトコード点灯適応型バイナリ範囲コーダを使用してエンコードされた 1 バイト。
1+0 + 長さ + 距離マッチシーケンスの長さと距離を記述する典型的な LZ77 シーケンス。
1+1+0+0ショートレップ1バイトのLZ77シーケンス。距離は最後に使用されたLZ77の距離に等しくなります。
1+1+0+1 + 長さロングレップ[0]LZ77シーケンス。距離は最後に使用されたLZ77の距離と同じです。
1+1+1+0 + 長さロングレップ[1]LZ77シーケンス。距離は最後に使用された2番目のLZ77の距離に等しくなります。
1+1+1+1+0 + 長さロングレップ[2]LZ77シーケンス。距離は最後に使用された3番目のLZ77の距離に等しくなります。
1+1+1+1+1 + 長さロングレップ[3]LZ77シーケンス。距離は最後に使用された4番目のLZ77の距離に等しくなります。

LONGREP[*]はLONG​​REP[0–3]パケットを参照し、*REPはLONG​​REPとSHORTREPの両方を参照し、*MATCHはMATCHと*REPの両方を参照します。

LONGREP[n] パケットは、最新の距離のリストから使用された距離を削除し、それを先頭に再挿入して、無駄な繰り返しエントリを回避します。一方、MATCH は、リストに既に存在する場合でも距離を先頭に追加するだけであり、SHORTREP と LONGREP[0] はリストを変更しません。

長さは次のようにエンコードされます。

長さコード(ビットシーケンス)説明
0+3ビット3 ビットを使用してエンコードされた長さは、2 から 9 までの範囲になります。
1+0+3ビット3 ビットを使用してエンコードされた長さは、10 から 17 の範囲になります。
1+1+8ビット8 ビットを使用してエンコードされた長さは、18 から 273 の範囲になります。

LZ77 と同様に、辞書からのコピーは、距離を一定に保ちながらバイトごとにコピーが実行されるかのように定義されているため、長さは距離によって制限されません。

距離は論理的には 32 ビットであり、距離 0 は辞書に最後に追加されたバイトを指します。

距離エンコーディングは6ビットの「距離スロット」から始まり、これにより必要なビット数が決まります。距離は、最上位から最下位の順に、距離スロットに応じた2ビット、固定確率0.5でエンコードされたビット、およびコンテキストエンコードされたビットからなるバイナリ連結としてデコードされます。これは以下の表に示されています(距離スロット0~3は、距離0~3を直接エンコードします)。

距離符号化[8]
6ビット距離スロット上位2ビット0.5 確率ビットを固定コンテキストエンコードされたビット
00000
10100
21000
31100
41001
51101
61002
71102
81003
91103
101004
111104
121005
131105
14~62(偶数)10スロット / 2 − 54
15~63(奇数)11(スロット − 1) / 2 − 54

解凍アルゴリズムの詳細

以下のテキストで試みられているもの以外に、圧縮形式の完全な自然言語仕様は存在しないようです。

以下の説明は、Linuxカーネルソース[10]に含まれるLasse CollinによるコンパクトなXZ Embeddedデコーダに基づいています。このデコーダから、LZMAとLZMA2アルゴリズムの詳細を比較的簡単に推測できます。したがって、ソースコードを参照として引用することは理想的ではありませんが、どのプログラマでも数時間の作業で以下の主張を確認できるはずです。

ビットの範囲コーディング

LZMA データは、LZMA デコーダーの指示に従って、範囲デコーダーによって 1 ビットずつデコードされる最下位レベルです。

コンテキストベースの範囲デコードは、LZMA アルゴリズムによって呼び出され、「コンテキスト」への参照を渡します。コンテキストは、ビットが 0 になる予測確率を表す符号なし 11 ビット変数prob (通常は 16 ビットのデータ型を使用して実装されます) で構成され、範囲デコーダーによって読み取られて更新されます (確率 0.5 を表すに初期化される必要があります)。

固定確率範囲デコードでは、代わりに 0.5 の確率を想定しますが、コンテキストベースの範囲デコードとは少し異なる動作をします。

範囲デコーダーの状態は、範囲(範囲のサイズを表す) とコード(範囲内のエンコードされたポイントを表す) の2 つの符号なし 32 ビット変数で構成されます。

範囲デコーダーの初期化は、範囲を2 32 − 1に設定しコードをビッグエンディアンとして解釈されたストリームの 2 番目のバイトから始まる 32 ビット値に設定することから構成されます。ストリームの最初のバイトは完全に無視されます。

正規化は次のように進行します。

  1. 範囲コードの両方を8ビット左にシフトする
  2. 圧縮ストリームから1バイトを読み取る
  3. コードの最下位8ビットを読み取ったバイト値に設定する

prob確率変数を使用したビットのコンテキストベース範囲デコードは次のように進行します。

  1. 範囲がより小さい場合は正規化を実行します
  2. バインド設定
  3. コードが境界より小さい場合:
    1. 範囲を境界設定
    2. prob をprob + 設定する
    3. ビット0を返す
  4. それ以外の場合(コードが境界以上の場合):
    1. 範囲を範囲-境界設定する
    2. コードをコード設定バインド
    3. 問題を設定
    4. ビット1を返す

固定確率範囲のビットのデコードは次のように進行します。

  1. 範囲がより小さい場合は正規化を実行します
  2. 範囲を設定
  3. コードが範囲より小さい場合:
    1. ビット0を返す
  4. それ以外の場合(コードが範囲より大きいか等しい場合):
    1. コードをコード範囲設定する
    2. ビット1を返す

Linuxカーネルの固定確率デコードの実装ではrc_direct()、パフォーマンス上の理由から条件分岐は含まれず、代わりにcodeからrange を無条件に減算します。減算された符号ビットは、返すビットを決定するだけでなく、 codeと組み合わせてrangeに加算するマスクを生成するためにも使用されます

ご了承ください:

  1. 境界演算と床演算を計算するときのによる除算は、乗算の後ではなく前に行われます(明らかに、64ビットの結果を持つ32ビット乗算に高速なハードウェアサポートが必要になるのを避けるためです)。
  2. 固定確率復号法は、任意の確率値を持つコンテキストベース範囲復号法と厳密には等価ではありません。これは、コンテキストベース範囲復号法では、前述のように確率を乗算する前に範囲の下位11ビットを破棄するのに対し、固定確率復号法では最後のビットのみを破棄するからです。

整数の範囲コーディング

レンジデコーダは、ビットツリー、逆ビットツリー、および固定確率整数デコード機能も提供します。これらは整数のデコードに使用され、前述の単一ビットデコードを一般化します。limit 未満の符号なし整数をデコードするために( limit − 1)個の11ビット確率変数の配列が提供されます。これらの変数は、概念的には、 limit 個の葉を持つ完全二分木の内部ノードとして配置されます

非逆ビットツリーデコードは、ルートから始まる変数ツリーへのポインタを保持することで機能します。ポインタがリーフを指していない限り、ビットはポインタが示す変数を用いてデコードされ、ビットが0か1かに応じてポインタは左または右の子に移動します。ポインタがリーフを指している場合は、そのリーフに関連付けられた番号が返されます。

したがって、非逆ビットツリーのデコードは最上位ビットから最下位ビットの順に行われ、有効な範囲内で 1 つの値のみが可能になった時点で停止します (これにより、LZMA ではこれを使用しなくても、概念的には 2 の累乗ではない範囲サイズが可能になります)。

逆ビットツリーデコードは、最下位ビットから最上位ビットへとデコードするため、2の累乗の範囲のみをサポートし、常に同じビット数をデコードします。これは、2の累乗 limit で非逆ビットツリーデコードを実行し結果の 最後のlog 2 ( limit )ビットを反転することと同等です。

Linux カーネルのrc_bittree関数では、実際には[ limit , 2 × limit )の範囲の整数が返されます (概念値にlimitが加算されます)。配列のインデックス 0 の変数は未使用ですが、インデックス 1 の変数はルートであり、左と右の子のインデックスは 2 iと 2 i + 1として計算されます。 rc_bittree_reverse関数は、代わりに[0, limit )の範囲の整数を呼び出し元が指定した変数に追加します。ここで、limit は暗黙的にその対数で表され、効率上の理由から独自の独立した実装があります。

固定確率の整数デコードは、単純に固定確率のビット デコードを繰り返し実行し、最上位ビットから最下位ビットまで読み取ります。

LZMA構成

LZMAデコーダは、lclppbの「プロパティ」バイトと辞書サイズによって設定されます。lclppbバイトの値はです。ここで、lc + lp * 9 + pb * 9 * 5

  • lcは、リテラルエンコードのコンテキストとして使用する前のバイトの上位ビットの数です(LZMA SDK で使用されるデフォルト値は 3 です)。
  • lpはliteral_pos_stateに含める辞書位置の下位ビットの数です(LZMA SDKで使用されるデフォルト値は0です)
  • pbはpos_stateに含める辞書位置の下位ビットの数です(LZMA SDKで使用されるデフォルト値は2です)

非 LZMA2 ストリームでは、lc は8 より大きくてはならず、lppb は4 より大きくてはなりません。これにより、範囲は 0 ~ 224 になります。LZMA2 ストリームでは、pb4 より大きくてはなりません。これにより、不可能な値のセットが大幅に大きくなります。lc + lp

7-Zip LZMAファイル形式では、設定は「プロパティ」バイトとそれに続く32ビット・リトルエンディアン辞書サイズ(バイト単位)を含むヘッダーによって行われます。LZMA2では、プロパティバイトはLZMA2 LZMAパケットの先頭で任意に変更でき、辞書サイズは後述するようにLZMA2ヘッダーで指定されます。

LZMAコーディングコンテキスト

LZMA パケット形式については既に説明しましたが、このセクションでは、LZMA が LZ エンコードされたストリームを統計的にモデル化する方法、つまり、各ビットをデコードするために範囲デコーダーに渡される確率変数を指定します。

これらの確率変数は多次元配列として実装されており、それらを導入する前に、これらの多次元配列のインデックスとして使用されるいくつかの値が定義されています。

状態は、概念的には、次の表のパターンのどれが最新の 2 ~ 4 個のパケット タイプと一致するかに基づいており、パケットが出力されるたびに、表にリストされている遷移表に従って更新されるステート マシン状態として実装されます。

初期状態は 0 であるため、先頭より前のパケットは LIT パケットであると見なされます。

以前のパケット次のパケットが次の状態になったとき
4つ前3つ前2つ前前の点灯マッチロングレップ[*]ショートレップ
0点灯点灯点灯0789
1マッチ点灯点灯0789
2ロングレップ[*]点灯点灯0789
*マッチショートレップ
3点灯ショートレップ点灯点灯0789
4マッチ点灯1789
5ロングレップ[*]点灯2789
*マッチショートレップ
6点灯ショートレップ点灯3789
7点灯マッチ4101111
8点灯ロングレップ[*]5101111
9点灯ショートレップ6101111
10*マッチマッチ4101111
11*マッチ*担当者5101111

pos_stateliteral_pos_state のは、それぞれ辞書位置(最後の辞書リセット以降に符号化されたバイト数を辞書サイズで割った値)の最下位ビットpblp(LZMA ヘッダーまたは LZMA2 プロパティパケットから取得される最大 4 ビット)で構成されます。辞書サイズは通常、2 の大きなべき乗の倍数であるため、これらの値は、最後の辞書リセット以降に確認された非圧縮バイト数の最下位ビットとして表現されます。

prev_byte_lc_msbs値は、前の非圧縮バイトのlc (LZMA ヘッダーまたは LZMA2 プロパティ パケットからの最大 4) の最上位ビットに設定されます。

is_REP値は長さを含むパケットが MATCH ではなく LONGREP であるかどうかを示します。

match_byte値は SHORTREP パケットが使用されていた場合にデコードされたバイト (つまり、最後に使用された距離の辞書で見つかったバイト) です。これは、*MATCH パケットの直後にのみ使用されます。

literal_bit_modeは、0 ~ 2 の範囲の 8 つの値の配列で、バイト内の各ビット位置に 1 つずつ対応しています。前のパケットが *MATCH で、それが最上位ビット位置であるか、エンコード/デコードするリテラルの上位ビットすべてがmatch_byte内の対応する位置のビットと等しい場合は 1 または 2 になり、それ以外の場合は 0 になります。1 または 2 の値の選択は、 match_byte内の同じ位置のビットの値によって決まります

リテラル/リテラル​​変数セットは、ビットツリーに似た「疑似ビットツリー」として考えることができますが、各ノードに 1 つではなく 3 つの変数があり、ノードによって示されるビットツリーコンテキストの後にデコードする次のビットのビット位置のliteral_bit_mode値に応じて選択されます。

いくつかの情報源で見られる、*MATCH の後のリテラルは、バイト値とmatch_byteの XOR としてコード化されるという主張は誤りです。代わりに、それらは、先ほど説明した疑似ビット ツリーと、以下の表にリストされている追加のコンテキストを使用して、単純にバイト値としてコード化されます。

LZMA で使用される確率変数グループは次のとおりです。

XZ名LZMA SDK名パラメータ化使用する場合コーディングモードビット0の場合ビット1の場合
一致一致状態 pos_stateパケット開始少し点灯*マッチ
is_repIsRepビットシーケンス1の後少しマッチ*担当者
is_rep0IsRepG0ビットシーケンス11の後少しショートレップ/ロングレップ[0]ロングレップ[1–3]
is_rep0_longIsRep0Long状態 pos_stateビットシーケンス110の後少しショートレップロングレップ[0]
is_rep1IsRepG1ビットシーケンス111の後少しロングレップ[1]ロングレップ[2/3]
is_rep2IsRepG2ビットシーケンス1111の後少しロングレップ[2]ロングレップ[3]
リテラルリテラルprev_byte_lc_msbs literal_pos_stateビットツリーコンテキストliteral_bit_mode[bit position]ビットシーケンス0の後256値の擬似ビットツリーリテラルバイト値
ディストリビューションスロットポススロットmin(match_length, 5)、ビットツリーコンテキスト距離: 開始64値のビットツリー距離スロット
特別配布スペックポスdistance_slot、逆ビットツリーコンテキスト距離: 4~13 距離スロット((distance_slot >> 1) − 1)-ビット逆ビットツリー距離の短いビット
距離調整整列逆ビットツリーコンテキスト距離: 固定確率ビット後の14以上の距離スロット4ビット逆ビットツリー距離の短いビット
len_dec.選択肢レンチョイスis_REP一致の長さ: 開始少し長さ2~9長さ10以上
len_dec.choice2レンチョイス2is_REP一致長: ビットシーケンス1の後少し長さ10~1718歳以上の長さ
len_dec.lowレンローis_REP pos_state、ビットツリーコンテキスト一致長さ: ビットシーケンス0の後8値ビットツリー長さの低いビット
len_dec.midレンミッドis_REP pos_state、ビットツリーコンテキスト一致長: ビットシーケンス10の後8値ビットツリー長さの中間部分
len_dec.highレンハイis_REP、ビットツリーコンテキスト一致長: ビットシーケンス11の後256値のビットツリー長さの上位ビット

LZMA2形式

LZMA2コンテナは、圧縮されたLZMAデータと非圧縮データの複数の実行をサポートします。各LZMA圧縮実行は、異なるLZMA構成と辞書を持つことができます。これにより、部分的または完全に圧縮できないファイルの圧縮率が向上し、ファイルを複数の実行に分割して個別に並列に圧縮または解凍することで、マルチスレッド圧縮およびマルチスレッド解凍が可能になります。LZMAに対するLZMA2の変更点として、ヘッダーフィールドがCRCでカバーされていないこと、並列解凍が実際には不可能であることなどが挙げられます。[7]

LZMA2 ヘッダーは辞書のサイズを示すバイトで構成されます。

  • 40は4GB−1の辞書サイズを示す
  • 40未満の値でも、辞書のサイズは2 v /2 + 12バイトであることを示します。
  • 40未満の奇数値は3×2 ( v − 1)/2 + 11バイトの辞書サイズを示す
  • 40を超える値は無効です

LZMA2 データは、次の値を持つ制御バイトで始まるパケットで構成されます。

  • 0はファイルの終わりを示す
  • 1は辞書のリセットとそれに続く非圧縮チャンクを示す
  • 2は辞書リセットのない非圧縮チャンクを示す
  • 3~0x7fは無効な値です
  • 0x80~0xffはLZMAチャンクを示し、下位5ビットは非圧縮サイズのビット16~20から1を引いた値として使用され、ビット5~6はリセットすべき値を示す。

LZMA チャンクのビット 5 ~ 6 は次のようになります。

  • 0: 何もリセットされない
  • 1: 状態リセット
  • 2: 状態リセット、プロパティバイトを使用したプロパティリセット
  • 3: 状態のリセット、プロパティバイトを使用したプロパティのリセット、辞書のリセット

LZMA 状態リセットは、辞書を除くすべての LZMA 状態をリセットします。具体的には、次のようになります。

  • レンジコーダー
  • 状態
  • 繰り返し試合の最終距離
  • すべてのLZMA確率

圧縮されていないチャンクは次のもので構成されます。

  • データサイズから1を引いた16ビットのビッグエンディアン値
  • 辞書にそのままコピーされるデータと出力

LZMA チャンクは次から構成されます:

  • 圧縮されていないサイズの下位16ビットから1を引いた値をエンコードした16ビットのビッグエンディアン値
  • 圧縮サイズから1を引いた16ビットのビッグエンディアン値
  • 制御バイトのビット6が設定されている場合は、プロパティ/lclppbバイト
  • LZMA圧縮データ。範囲コーダを初期化するために使用される5バイト(最初の1バイトは無視されます)から始まります(圧縮サイズに含まれます)。

xzおよび7z形式

LZMA2データを含むことができる.xz形式についてはtukaani.org [ 11]で文書化されていますが LZMAまたはLZMA2データを含むことができる.7zファイル形式については、LZMA SDKに含まれる7zformat.txtファイルで文書化されています。[12]

7-Zip リファレンス実装

7-Zipから抽出されたLZMA実装は、LZMA SDKとして利用可能です。当初はGNU LGPLCommon Public Licenseの両方のライセンスの下で提供されていましたが[13]リンクされたバイナリには特別な例外が加えられていました。しかし、2008年12月2日のバージョン4.62のリリースに伴い、Igor Pavlovによってパブリックドメインとなりました[12] 。

LZMAの改良版であるLZMA2圧縮[14]は、2012年10月26日のバージョン9.30から、.7z形式のデフォルトの圧縮方式になりました。[15]

オープンソースのLZMA圧縮ライブラリはもともとC++で書かれていましたが、 ANSI CC#Javaに移植されています[12] C++ライブラリにはサードパーティのPythonバインディングもあり、 [16] LZMAのPascal[17] Go [18] Adaへの移植もあります[19]

7-Zip 実装では、辞書検索アルゴリズムの基礎として、ハッシュ チェーンバイナリ ツリーパトリシア ツリーのいくつかのバリエーションを使用します。

LZMAに加えて、SDKと7-Zipは、圧縮率を向上させるための複数の前処理フィルタを実装しています。これには、画像用のシンプルなデルタエンコーディングから実行コード用のBCJまで、さまざまなものがあります。また、7zで使用されるその他の圧縮アルゴリズムもいくつか提供しています。

LZMAの解凍専用コードは、通常約5KBにコンパイルされます。解凍に必要なRAMの量は、主に圧縮時に使用されるスライディングウィンドウのサイズによって決まります。コードサイズが小さく、特に辞書長が短い場合のメモリオーバーヘッドが比較的低いこと、そしてソースコードが無料であることから、LZMA解​​凍アルゴリズムは組み込みアプリケーションに最適です。

その他の実装

7-Zip リファレンス実装に加えて、以下も LZMA 形式をサポートしています。

  • xz : gzipのようなコマンドラインツールを含むストリーミング実装で、xz ファイル形式でLZMAとLZMA2の両方をサポートしています。bzip2 と比較して高いパフォーマンスと gzip と比較して小さいサイズという特徴から、Unix系ソフトウェアの多くに採用されています。[ 3 ] LinuxカーネルdpkgRPMシステムxzコードが含まれており、 kernel.orgDebian [20]Fedoraなどの多くのソフトウェアディストリビュータがリリースの圧縮にxzを使用しています。
  • lzip : xzの代替となる、主にUnix系システム向けのLZMA実装です。[21]よりシンプルなファイル形式と、より簡単なエラー回復機能を備えています。
  • ZIPX : WinZipバージョン12.1以降で作成されたZIP圧縮形式の拡張版。BZipPPMdなど、他の様々な圧縮方式も使用できます [ 22]

参考文献

  1. ^ サロモン、デイビッド(2007年3月20日)『データ圧縮:完全リファレンス』シュプリンガー・ロンドン、242ページ。ISBN 9781846286032
  2. ^ Igor Pavlov (2001年12月5日). 「7zフォーマット」. 2001年12月5日時点のオリジナルよりアーカイブ。
  3. ^ ab Lasse Collin (2005年5月31日). 「クイックベンチマーク:Gzip vs. Bzip2 vs. LZMA」 . 2015年10月21日閲覧- LZMA Unix ポートは最終的に、より優れた高速圧縮機能を備えた xz に置き換えられました。このことから、LZMA Unix ポートは gzip や bzip2 よりもはるかに優れていることがわかります。
  4. ^ Klausmann, Tobias (2008年5月8日). 「Gzip、Bzip2、Lzmaの比較」アルファ動物のブログ. 2013年1月6日時点のオリジナルよりアーカイブ。 2013年6月16日閲覧
  5. ^ 不明 (2013). 「7zフォーマット」. 2013年6月16日閲覧。
  6. ^ Mahoney, Matt. 「データ圧縮の説明」2013年11月13日閲覧
  7. ^ ab Antonio Diaz Diaz. 「XZフォーマットは長期アーカイブには不十分」2018年7月20日閲覧
  8. ^ abcd "LZMA SDKのLZMA仕様.7z". 7-zip.org .
  9. ^ ab 「Lzipストリームフォーマット」。Lzipマニュアル。 2019年11月14日閲覧
  10. ^ Collin, Lasse; Pavlov, Igor. 「lib/xz/xz_dec_lzma2.c」 . 2013年6月16日閲覧
  11. ^ 「.xzファイルフォーマット」. 2009年8月27日. 2013年6月16日閲覧
  12. ^ abc Igor Pavlov (2013). 「LZMA SDK (ソフトウェア開発キット)」 . 2013年6月16日閲覧
  13. ^ “Browse /LZMA SDK/4.23”. SourceForge . 2014年2月12日閲覧。
  14. ^ 「Inno Setup ヘルプ」。jrsoftware.org 。 2013年6月16日閲覧。LZMA2はLZMAの改良版で、圧縮不可能なデータの圧縮率が向上しています(ランダムデータは約0.005%拡張されますが、オリジナルのLZMAでは1.35%です)。また、オプションで大きなファイルの複数の部分を並列圧縮できるため、圧縮速度が大幅に向上しますが、圧縮率が低下する可能性があります。
  15. ^ 「7-Zipの歴史」2012年10月26日. 2013年6月16日閲覧
  16. ^ Bauch, Joachim (2010-04-07). 「PyLZMA – LZMA圧縮ライブラリ向けのプラットフォーム非依存のPythonバインディング」 . 2013年6月16日閲覧
  17. ^ Birtles, Alan (2006年6月13日). 「プログラミングヘルプ: Pascal LZMA SDK」 . 2013年6月16日閲覧
  18. ^ Vieru, Andrei (2012年6月28日). 「Go 1用のcompress/lzmaパッケージ」。2016年9月21日時点のオリジナルよりアーカイブ2013年6月16日閲覧。
  19. ^ 「Zip-Ada」.
  20. ^ Guillem Jover. 「dpkg 1.17.0 (source amd64 all) を承認」Debian パッケージ QA . 2015年10月21日閲覧
  21. ^ Diaz, Diaz. 「Lzipベンチマーク」. LZIP (nongnu).
  22. ^ 「Zipxファイルとは?」WinZip.com . 2016年3月14日閲覧
  • 公式ホームページ
  • Lzip形式の仕様
  • XZ形式の仕様
  • LZMA SDK(ソフトウェア開発キット)
  • LZMA ユーティリティ = XZ ユーティリティ
  • XZ Utils の Windows バイナリ
  • データ圧縮、コンプレッサー、アーカイバー
Retrieved from "https://en.wikipedia.org/w/index.php?title=LZMA&oldid=1305067429"