web-dev-qa-db-ja.com

異なる「圧縮」システムの違いは何ですか?

圧縮には常にTARとZipを使用していましたが、最近*.Z圧縮アルゴリズムについて聞いたことがあります。これは私に質問をもたらしました:

これらのすべての圧縮システムで、一般的な使用と圧縮に最適なのはどれですか?

いくつかのテストを実行すると、tarは、明示的に指定されていない限り、実際には圧縮されないことがわかりました。意味、他の圧縮方法と比較して何が良いですか?

Zipは最も広く使用されている圧縮システムであることは既に知っていますが、*.Z*.7z.tar、または.tar.<insert ending here>の代わりに使用する必要がありますか?

投稿の要約:

  1. 最適な圧縮を行うには、*.tar*.Z*.7z.tar、または.tar.<insert ending here>を使用する必要がありますか?
  2. プレーン*.tarが圧縮されない場合、なぜそれを使用するのですか?

編集:すべてのアルゴリズムがLinuxの許可を保存できるわけではありません(私が学んだことから)。許可を保存するために使用できるハック(またはスクリプト)がありますか?

9
Kaz Wolfe

tarはテープアーカイブを表します。ファイルとそのメタデータ(アクセス許可、所有権など)を、テープドライブ(またはファイル)に保存して後で復元できるバイトストリームにパックするだけです。圧縮は完全に独立した問題であり、必要に応じて圧縮するために外部ユーティリティを介して出力をパイプする必要がありました。 GNU tarは、適切なユーティリティを使用してショートカットとして出力を自動的にフィルター処理するようにスイッチを追加するのに十分でした。

Zipと7zはアーカイブと圧縮を組み合わせて独自のコンテナ形式にし、DOS/Windowsシステムにファイルをパックすることを意図しているため、UNIXのアクセス許可と所有権は保存されません。したがって、適切なバックアップのためのアクセス許可を保存する場合は、tarを使用する必要があります。 Windowsユーザーとファイルを交換する場合は、Zipまたは7zが適しています。 Zipおよび7Zipが使用する実際の圧縮アルゴリズムは、それぞれgzipおよびlzmaを指定することにより、tarで使用できます。

lzma(aka。* .xz)は最高の圧縮率の1つであり、解凍が非常に高速であるため、最近では最高の選択となっています。ただし、圧縮には大量のRAMとCPU時間が必要です。由緒あるgzipは圧縮時にかなり高速であるため、それほど多くのCPU時間を使いたくない場合に使用できます。また、lzopと呼ばれるさらに高速なバリアントがあります。 bzip2は、7Zip/lzmaが登場する前にgzipに取って代わったため、まだかなり人気があります。これは、圧縮率が向上したためです。圧縮比。 compressユーティリティは、通常ファイル* .Zに名前を付けますが、古くから忘れられていました。

Zipとtarのもう1つの重要な違いの1つは、Zipがデータを小さなチャンクで圧縮するのに対して、tarファイルを圧縮すると、すべてを一度に圧縮することです。後者の方が圧縮率は高くなりますが、アーカイブの最後で単一のファイルを抽出するには、ファイル全体を解凍する必要があります。したがって、Zip形式は、大きなアーカイブから1つまたは2つのファイルを抽出するのに適しています。 7zおよびdarを使用すると、全体を圧縮するか(「ソリッド」モードと呼ばれる)、または断片を簡単に抽出できるように小さなチャンクを選択できます。

17
psusi

アルゴリズムの詳細はここではオフトピックです1 それらはLinuxに固有のものではなく、Ubuntuは言うまでもありません。ただし、いくつかの素敵な情報があります ここ

さて、tarについては、あなたが言ったように、tarは圧縮プログラムではありません。代わりに、archiver;その主な目的は、多数の小さなファイルから1つの大きなファイルを作成することです。歴史的に、これはテープドライブへの格納を容易にするためでした。そのため、名前はTape ARchiveです。

現在、tarを使用する主な理由は、システム上のファイルの数を減らすことです。 Unixファイルシステム上の各ファイルは inode を使用し、ファイルが多いほど使用可能なiノードが少なくなり、iノードがなくなると新しいファイルを作成できなくなります。簡単に言うと、数千のファイルとして保存されている同じ量のデータが、単一のtarアーカイブ内の同じファイルよりも多くのハードドライブを占有します。

説明のために、これはコメントで争われているので、私の68G /パーティションには、次の合計iノード数と使用済みiノードがあります(iノード数はファイルシステムのタイプとサイズに依存することに注意してください)パーティション):

Inode count:              393216
Free inodes:              171421

今、iノードよりも多くのファイルを作成しようとすると、

$ touch {1..171422}
touch: cannot touch ‘171388’: No space left on device
touch: cannot touch ‘171389’: No space left on device
touch: cannot touch ‘171390’: No space left on device
touch: cannot touch ‘171391’: No space left on device
touch: cannot touch ‘171392’: No space left on device
touch: cannot touch ‘171393’: No space left on device
touch: cannot touch ‘171394’: No space left on device
touch: cannot touch ‘171395’: No space left on device
touch: cannot touch ‘171396’: No space left on device
touch: cannot touch ‘171397’: No space left on device

立つ瀬がない?しかし、私はたくさんのスペースがあります:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5,8G  4,3G  1,2G  79% /

上記からわかるように、数十万の空のファイルを作成すると、iノードがすぐに使い果たされ、新しいファイルを作成できなくなります。 tarにした場合、これらのファイルの作成を再開できます。

また、ファイルが少ないと、特にNFSマウントされたファイルシステムでのファイルシステムI/Oが大幅に高速化されます。私が持っているファイルが少ないほど、findのような高速なプログラムが動作するため、プロジェクトが終了するときは常に古い作業ディレクトリをtarします。

スーパーユーザーには 偉大な答え がありますが、上記に加えて、上記に加えて、tarが今でも人気がある他の基本的な理由は次のとおりです。

  1. 効率:tarを使用してgzipのような圧縮プログラムをパイプ処理すると、中間ファイルの作成が回避されるため、より効率的です。

  2. tarにはさまざまな機能があり、* nixバックアップ(アクセス権、ファイル所有権、データを直接STDOUTにパイプする機能など)に特に役立つ長い歴史にわたって設計された機能があります。 SSHリンク...)

  3. 慣性。 tarに慣れています。使用する可能性のあるすべての* nixで利用できると想定するのは安全です。これにより、ソースコードのtarballに非常に移植しやすくなります。


1 これは絶対に真実であり、私がそれらについて説明するのに十分な知識がないという事実とは何の関係もない:)

9
terdon

2つの異なるが関連するタスクがあります。ファイルのツリー(ファイル名、ディレクトリ構造、ファイルシステムのアクセス許可、所有権、およびその他のメタデータを含む)をバイトストリームにパックすることは、archivingと呼ばれます。バイトストリームの冗長性を削除してより小さなバイトストリームを生成することを、compressionと呼びます。

Unixでは、2つの操作は分離されており、それぞれに別個のツールがあります。他のほとんどのプラットフォーム(現在および過去)で、結合ツールはアーカイブと圧縮の両方を実行します。

(gzipおよびgzipのインターフェイスを模倣するその他のプログラムには、多くの場合、元のファイル名を圧縮出力に保存するオプションがありますが、CRCまたは破損を検出するその他のチェックと一緒に保存できる唯一のメタデータです。)

圧縮をアーカイブから分離することには利点があります。アーカイブはプラットフォーム固有です(保存が必要なファイルシステムのメタデータは大きく異なります)が、実装は簡単で、主にI/Oにバインドされ、時間の経過とともにほとんど変化しません。圧縮はプラットフォームに依存しませんが、実装はCPUに依存しており、アルゴリズムは絶えず改善されており、現代のハードウェアが問題にもたらす可能性のある増大したリソースを活用しています。

最も一般的なUnixアーカイバはtarですが、cpioarなど他のものもあります。 (Debianパッケージはarアーカイブですが、cpioは初期RAMディスクによく使用されます。)tarは、compress(.Z)、gzip(.gz)、bzip2(.bz2)などの圧縮ツールと組み合わせられることがよくあります。およびxz(.xz)、最も古いものから最も古いものへ、最悪の圧縮から最高の圧縮への偶然ではありません。

tarアーカイブの作成と圧縮は別個のステップです。コンプレッサーはtarファイル形式について何も認識しません。つまり、圧縮されたtarアーカイブから単一のファイルを抽出するには、先行するすべてのファイルを解凍する必要があります。これは、多くの場合「ソリッド」アーカイブと呼ばれます。

同様に、tarはパイプラインで役立つために必要な「ストリーミング」形式であるため、tarアーカイブにはグローバルインデックスがなく、tarアーカイブの内容を一覧表示することは、展開するのと同じくらい高価です。

対照的に、ZipとRARおよび7-Zip(最新のWindowsプラットフォームで最も人気のあるアーカイバー)は通常、各ファイルを個別に圧縮し、メタデータを圧縮します。これにより、アーカイブ内のファイルの簡単なリストと個々のファイルの抽出が可能になりますが、同じアーカイブ内の複数のファイル間の冗長性を利用して圧縮率を上げることはできません。一般に、すでに圧縮されたファイルを圧縮してもファイルサイズはさらに小さくなりませんが、Zipファイル内にZipファイルが表示されることがあります:最初のzip圧縮では、多くの小さなファイルが1つの大きなファイルになりました(おそらく圧縮が無効になっています)圧縮して単一のエンティティとして圧縮します。

異なるプラットフォームと哲学の間には他家受粉があります。gzipは、本質的にアーカイバのないZipのコンプレッサーであり、xzは、本質的にアーカイバーのない7-Zipのコンプレッサーです。

他にも、専用のコンプレッサーがあります。 PPMバリアントとその後続のZPAQは、リソースの消費に関係なく最大の圧縮のために最適化されます。 CPUとRAMを簡単に噛み砕くことができ、解凍は圧縮と同じくらい負担がかかります(対照的に、最も広く使用されている圧縮ツールはasymmetric:圧縮解除より圧縮解除の方が安価です。

スペクトルのもう一方の端では、lzosnappy、およびLZ4は、圧縮を犠牲にして、最大速度と最小リソース消費のために設計された「軽量」コンプレッサーです。ファイルシステムや他のオブジェクトストア内で広く使用されていますが、スタンドアロンツールとしてはあまり使用されていません。


どちらを選ぶべきですか?

アーカイブ:

Ubuntuを使用しているので、アーカイブにtar以外のものを使用する本当の理由はありません。ただし、他の場所で簡単に読み取れるファイルを作成しようとしている場合を除きます。

Zipは普遍性に勝るものはありませんが、Unix中心ではなく、ファイルシステムのアクセス許可と所有権情報を保持しません。また、焼き付けられた圧縮は時代遅れです。 7-ZipとRAR(およびZPAQ)は、より現代的な圧縮を備えていますが、Unixファイルシステムのアーカイブには等しく適していません(ただし、圧縮機として使用するのを止めるものは何もありません)。 RARも独自仕様です。

圧縮:

最大限の圧縮を行うには、 http://mattmahoney.net/dc/text.html にある巨大なものなどのベンチマークをご覧ください。これにより、関連するトレードオフのより良いアイデアが得られます。

ただし、おそらく最大の圧縮は必要ありません。あまりにも高価です。

xzは、最新のUnixシステムで最も人気のある汎用圧縮ツールです。 7-Zipは、xzファイルも密接に関連しているため、読み取ることができると考えています。

最後に、短期ストレージ以外のデータをアーカイブする場合は、オープンソースで、できれば広範囲に及ぶものを選択して、後で頭痛を最小限に抑える必要があります。

4
hexwab

lzo, gz, b2, lzma (.lzma2 =.xz)は「ストリーム」コンプレッサーです。ファイル、ディレクトリ、パーミッションなどのメタデータを知らず、気にしないバイのストリームを圧縮します。 tarなどのアーカイバを使用して、すべてのデータをバイトストリーム(tarファイル)にバンドルし、コンプレッサーで圧縮する必要があります。関心のある単一のファイルのdataである場合は、そのファイルのみをこれらのコンプレッサーのいずれかにフィードすることもできます。

Tar, cpio and paxはアーカイバです。ファイルとディレクトリの束を取り、単一のファイルにデータとメタデータをエンコードします。 tarは最も人気があり、最も互換性がありますが、3つの技術的なメリットは最小限に抑えられており、夜明けに宗教的な戦争が発生しました。

7zとZipはコンプレッサーであり、アーカイバーです。その後、すべてのデータとメタデータを保存して圧縮します。ただしAFAICT、どちらもUNIXのアクセス許可を保存しません。

Zipは、DEFLATEと呼ばれるgzipと同じアルゴリズムを使用します。 7zはlzmaアルゴリズムを使用します

tar.gzなどから単一のファイルを読み取るには、抽出できるように十分なtarファイルが公開されるまでgzストリーム全体を解凍する必要があります。 Zipを使用すると、各ファイルを個別に圧縮および抽出できます。 7zはどちらの動作も可能です。

圧縮率と速度:gzipとlzoの圧縮と解凍の速度は非常に高速ですが、圧縮率は低くなります。また、圧縮に多くのメモリを必要としません。 gzipはlzoよりも少し遅く、圧縮率も少し高くなります。

これは非常に高速であるため、非圧縮ファイルをディスクから直接読み取る代わりに、ディスクからgzまたはlzo圧縮ファイルを読み取り、その場で解凍する方が高速です。

LZMA(xz)は、一般データに対して優れた圧縮を提供しますが、圧縮にかなりの量のメモリを使用するのに加えて、圧縮および解凍に非常に長い時間がかかります。

以前はbz2が高圧縮アルゴリズムとして選択されていましたが、lzmaよりも低速であり、圧縮と解凍に時間がかかるため、好まれなくなりました。ただし、特定の種類のデータ(dnaシーケンス、同じバイトの非常に大規模な実行などのファイル)の場合、bzip2は他のすべてを打ち負かすことができます。例として、1の4GBファイルを圧縮する必要があり、b2はiを数10 kbに減らしましたが、lzmaは正しく覚えていれば数10 MBを取りました。

1
staticd

特に大きなファイルの場合、rzipを使用できます。最初に900 MBの大きなブロック内の冗長データを調べ、これらをエンコードしてから、データをbzip2に渡します(実際には同じではありませんが、同じアルゴリズムが使用されます)。

効果? xzlzma、またはbzip2よりもはるかに高速であり、私の経験では、その圧縮率はlzmaの圧縮率に匹敵します。ただし、RAM hogです。

http://en.wikipedia.org/wiki/Rzip

0
user258532