7zで圧縮方法を組み合わせると、実際にはどうなりますか?


11

7zコマンドラインツールを使用すると、次のような複数の圧縮方法を指定できます

# 7-zip archive type, strongest (9) compression, methods PPMd, BCJ2, LZMA2
$ 7z a -t7z -mx=9 -m0=PPMd -m1=BCJ2 -m2=LZMA2 myarchive.7z somefile.xml

すべてのメソッドは何らかの方法で使用されるか、少なくともメタデータで指定されます。

$ 7z l -slt myarchive.7z

7-Zip [64] 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: myarchive.
7z

--
Path = myarchive.7z
Type = 7z
Method = LZMA2 PPMD BCJ2
[..]

----------
Path = somefile.xml
[..]
Method = PPMD:o32:mem192m BCJ2 LZMA2:48m
Block = 0

3つすべての方法でファイルを実行しているようではなく、最適な方法を選択しています。むしろ、メソッドの順序を変更するとファイルサイズに大きく影響するため、常に常に最初のものが選択されます。

1つのXMLファイル(PPMdが最高の圧縮をもたらす)や1つのバイナリファイル(LZMA2が行う)などの複数のファイルを追加した場合でも、両方のファイルのすべてのメソッドがリストされ、ファイルごとに動的に切り替わるようには見えません。

実際、ドキュメントには「メソッドはいくつでも使用できる」と明記されていますが、その理由は記載されていません。

私が達成しようとしているのは、ファイルごとの「複数の方法を試して、どちらがベストかを選ぶ」アーカイブです。もちろん、小さなスクリプトを使用して手動でこれを実現できますが、おそらく、圧縮方法をチェーンすることで正確に実行できますか?


圧縮方法の順序を変更すると、すべての方法が順番に適用された場合でも、圧縮サイズ変更されます。ほとんどの圧縮は、通常、最初に適用された方法から行われます。その結果は通常、エントロピーが高く、それ以上圧縮するのは困難です。データ自体を圧縮することは期待されていないが、より圧縮可能になるようにエンコードする変換には例外があります。たとえば、シーケンス1、2、3、4、5には値の繰り返しはありませんが、違いの繰り返しがあります。デルタ変換は圧縮率を向上させます。それがダニエルBの答えです。
Steve314 2014

7zipの機能は実際にはわかりません。「メソッドの順序を変更するとファイルサイズに大きく影響するため」というロジックにコメントするだけです。
Steve314 2014

回答:


5

一般に、圧縮データは(さらに)効率的に圧縮できません。最初の圧縮方法が適用された後は、ファイルサイズを大幅に減らすことはできません。

これ-mN=Xは主にフィルターを指定するためのものです(Windowsヘルプファイルから取得)。

サポートされるフィルター:

デルタデルタフィルター(「デルタオフセットをバイト単位で設定できます。たとえば、16ビットステレオWAVファイルを圧縮するには、「0 = Delta:4」を設定できます。デフォルトのデルタオフセットは1です。」)

x86実行可能ファイル用のBCJコンバーター

x86実行可能ファイル用のBCJ2コンバーター(バージョン2)(「BCJ2は32ビットx86実行可能ファイル用のブランチコンバーター(バージョン2)です。さらに圧縮を増やすためにいくつかの分岐命令を変換します。」)

ARM(リトルエンディアン)実行可能ファイル用のARMコンバーター

ARM Thumb(リトルエンディアン)実行可能ファイル用のARMTコンバーター

IA-64実行可能ファイル用のIA64コンバーター

PowerPC(ビッグエンディアン)実行可能ファイル用のPPCコンバーター

SPARC実行可能ファイル用のSPARCコンバーター

また、ヘルプファイルから、BCJ2フィルターの複数の出力ストリームを利用する高度な例:

7z a -t7z archive.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d23 -m2=LZMA:d19 -m3=LZMA:d19      -mb0:1 -mb0s1:2 -mb0s2:3

BCJ2コンバーターを使用して、archive.7zをアーカイブに* .exeおよび* .dllファイルを追加します。メイン出力ストリーム(s0)に8 MBディクショナリを備えたLZMA、およびBCJ2のs1およびs2出力ストリームに512 KBディクショナリを備えたLZMA。


「最初の圧縮方法が適用された後は、ファイルサイズを大幅に減らすことはできません。」- 承知しました。私の希望は、複数のメソッドを指定すると、ファイルごとに、指定された各メソッドが試行され、最も効率的な方法が選択されることでした。当然、これにより圧縮がかなり遅くなります。
ソレンKuklau

2

フィルターを順番に適用できるようです。

昨年のこの投稿には素晴らしい説明があります:

7-zipの-mスイッチの後の数字はどういう意味ですか?

この数により、一度に複数を使用する場合に圧縮操作の順序を設定できます。

これはドキュメントの例です:

7z a a.7z *.exe *.dll -m0=BCJ2 -m1=LZMA:d25 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3

* .exeファイルと* .dllファイルを追加して、BCJ2フィルターを使用してa.7zをアーカイブし、メイン出力ストリーム(s0)に32 MB辞書を使用するLZMA、BCJ2のs1およびs2出力ストリームに512 KB辞書を使用するLZMAを追加します。

最初の圧縮は最小値であり、ゼロです。この例では、BCJ2にゼロが設定されています。次に、LZMAです。2つと3つもLZMAですが、異なるdパラメータを使用しています。

-mbオプションは、ある圧縮からの出力を別の圧縮の入力に「バインド」するために使用されます。この例では、BCJ2には1つの入力と4つの出力があります。出力ゼロは圧縮数1になります。出力1は圧縮番号2になります。出力2は圧縮番号3に送られます。出力3はバインドされません(再度圧縮する必要がないため)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.