類似ファイルを効率的に圧縮


11

よく似たファイルを圧縮する必要がよくあります。

現在私は7Zipを使用しています。これは、Ultra設定の8コアを使用して、約35分で16GBファイルを1.2GBに圧縮します。

その時間の多くは、圧縮に使用する辞書の計算に費やされているようです。ファイルは非常に類似しているため、実際に使用される辞書も同様です。

辞書を保存し、その保存した辞書を後続のファイルに再利用できるWindowsベースの圧縮ツール(知らないオプションが付いた7Zip、または別のツール)はありますか?

大幅に高速に圧縮しながら、私が持っているものと同様の圧縮率を維持するという問題に取り組むより良い方法はありますか?

回答:


5

レンペル-ジブ-ウェルチ(LZW)圧縮アルゴリズム自体が実際に辞書を計算された仕事の大部分と、本質的に、計算集約的です。これは文字通りLZWが機能する方法です。

アルゴリズム自体は、スキャンする次の「シンボル」ごとに1つの新しい辞書エントリを追加します。したがって、1回の反復ごとに、新しいエントリが辞書に追加されます。実際、ディクショナリはファイルの圧縮されたコピーになるため、LZW圧縮が最初に計算にかなりの時間を費やしているのは、実際にはこれだけです。


ハフマンエンコーディングのようなものを使用した場合、辞書の再利用は確かに可能です(圧縮率/サイズが最適とは言えない可能性があります)。ただし、ほとんどの最新の圧縮アルゴリズムとツールは、効率と速度のためにLZWアルゴリズムを使用します(ハフマン圧縮では、データを2回パスする必要があります(1つはハフマンツリー/テーブルを生成するため、もう1つは実際にデータを圧縮するため))。シングルパス)。


1
ハフマンと事前定義された辞書を使用すると、1つのパスだけが必要ですか?保存された辞書をサポートする市販のハフマンベースのツールはありますか?
エリックJ.

@EricJ。はい、定義済みの辞書を使用すると、シングルパスエンコーディングになります。私が個人的に書いたプログラムがありますが、これを行うことができる手持ちのソフトウェアは知りません。私はまだ試していませんが、このツールはそれだけで実行できるように見えます。ただし、ハフマンエンコードされたビットストリームをデコードするには(ここでもLZWとは異なり)、データを解凍するには元の辞書が必要であることに注意してください。
2013年

そのツールの古さに基づいて、私はそれがシングルスレッドであることを推測しています。8ではなく1コアを使用すると、固定ディクショナリへの利点が相殺されると思います:-(反対側でディクショナリを使用できるようにすることは、私のシナリオ(データセンター間での大きなファイルの転送)で実現可能です)
Eric J.

2

DEFLATEアルゴリズムとは異なり、7-ZipのLZMAはデフォルトでソリッド圧縮を使用します。これにより、ファイル間の冗長性が利用されます。これは、ファイルが十分に小さい限り、デフォルト設定で動作します。

デフォルトの設定で2ギガバイトのための固形ブロックサイズ 16 GBのファイルは、実際には8つの別個のチャンクとして圧縮されます。

@Breakthorughがすでに言ったように、辞書はその場で生成されます。これを経験的に確認するには、Solid Block sizeSolid(すべてのファイルを一度に圧縮)およびNon-solid(各ファイルを個別に圧縮)に設定します。

ソリッドブロックのサイズを大きくすると、実際には速度が低下しますが、圧縮率が大幅に向上する可能性があります。たとえば、2つの同一のファイルを圧縮すると、非圧縮のほぼ2倍のサイズのアーカイブが作成されます。


1
私の場合、同じようなファイルを1つずつ別の機会に圧縮します。所定のアーカイブには、16 GBのファイルが1つだけあります。
エリックJ.

あ、そう。私はそれを誤解しました。新しいアーカイブが作成されると、古いアーカイブは削除されますか?いいえの場合、複数のファイルを1つのアーカイブに保存することは許可されますか?これは圧縮速度には役立ちませんが、ファイルの実際の類似度によっては、比率に役立つ場合があります。
デニス

1
気にしないでください。ソリッドアーカイブの更新にはかなり時間がかかりますが、圧縮率は向上しません。
Dennis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.