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


9

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

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

いくつかのテストを実行したところ、発見したtarように、(明示的に指定されていない限り)実際には圧縮されないことがわかりました。つまり、他の圧縮方法と比べて何が良いのでしょうか?

私はすでにZIPは、最も広く使用されている圧縮方式であることを承知していますが、私は代わりにそれを使用する必要があり*.Z*.7z.tar、または.tar.<insert ending here>

投稿の要約:

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

編集:すべてのアルゴリズムがLinuxパーミッションの保存を許可するわけではありません(私が学んだことから)。どちらを実行しますか。また、アクセス許可を格納するために使用できるハッキング(またはスクリプト)はありますか?


そんなことを言う必要はありません。投票した上位1つ、または最も役に立った投票を選んでください:)
Seth

回答:


17

tarテープアーカイブを意味します。パックファイルとそのメタデータ(権限、所有権など)をバイトストリームにパックして、テープドライブ(またはファイル)に保存し、後で復元するだけです。圧縮は、外部ユーティリティを介して出力をパイプ処理し、必要に応じて圧縮する必要があった完全に別の問題です。GNU tarは、適切なユーティリティを介してショートカットとして出力を自動的にフィルタリングするように指示するスイッチを追加するのに十分なほど優れていました。

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

lzma(別名。* .xz)は、最高の圧縮率の1つであり、解凍速度が非常に速いため、最近ではこれが最も適しています。ただし、圧縮には大量のRAMとCPU時間を必要とします。由緒あるものgzipは圧縮時にかなり速いので、それほど多くのCPU時間を費やしたくない場合に使用できます。lzopと呼ばれるさらに高速なバリアントもあります。 bzip2圧縮率が向上したため、7zip / lzmaが登場する前にgzipが大幅に置き換えられたため、今でもかなり人気がありますが、7z / lzmaは解凍が高速であり、圧縮率が向上するため、最近は支持されなくなっています。このcompressユーティリティは通常ファイルに* .Zという名前を付けており、古くて忘れられがちです。

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


しかし、メタデータをサポートするのはTARだけですか?または、gzip / bzip2がメタデータもサポートするようになりました
Kaz Wolfe

@pacificfils、圧縮ユーティリティは、メタデータなしで単一のファイルのみを圧縮します。
psusi 2014年

フォルダをtarし、それをzipに入れてアクセス許可を保持することはできますか?
Kaz Wolfe 14年

@pacificfils、そうですが、zipの利点との圧縮率の向上をあきらめるので、少しばかげたことになりますgzip
psusi 14年

@pacificfils tar cfpは権限を保持します。tarファイルは圧縮されていないため、zip(7-zip)、gzip2、gzip、lzoなどはすべてtarファイルを適切に圧縮します(一般に、圧縮ファイルのtarは圧縮されそうにありません)。
エリオットフリッシュ

9

アルゴリズムの詳細は、Ubuntuはもちろんのこと、Linuxに固有ではないため、ここではトピックから外れています1。ただし、ここにいくつかの良い情報があります

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

今日、使用する主な理由tarは、システム上のファイルの数を減らすことです。Unixファイルシステム上の各ファイルは取りiノード、少数の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ノードが使い果たされ、新しいiノードを作成できなくなります。tarこれらを行った場合、ファイルの作成を再開できます。

ファイル数が少ないと、特にNFSマウントされたファイルシステムでのファイルシステムI / Oが大幅に高速化されます。プロジェクトが終了すると、古い作業ディレクトリを常にtar形式で保存します。ファイル数が少ないほど、のような高速プログラムfindが機能するからです。

スーパーユーザーについて、より詳細に説明したすばらしい答えがありますが、上記に加えて、tar今日でも人気がある他の基本的な理由は次のとおりです。

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

  2. tar すべての種類のベルとホイッスル、その長い歴史に基づいて設計された機能が* nixバックアップ(アクセス許可、ファイルの所有権、STDOUTおよびSSHリンクを介してデータを直接パイプする機能など)に特に役立ちます... )

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


1これは完全に真実であり、私が説明するのに十分なほど彼らについて知らないという事実とは何の関係もありません:)


3
私のコンピューターには(過去に)10,000,000以上のファイルがありましたが、それはそれほど狂気ではありません。tarほとんどのファイルシステムは率直に気にしないので、「ファイル数を減らす」ことは決してtarしません。また、ファイルへの簡単なランダムアクセスをサポートしていないので、とにかく本当に最適ではありません。むしろ、(私にとって、そして私はほとんどの人にとっては)主な用途は、簡単な方法で他の人々とファイル(例えばソースコード)を共有することです。
nneonneo 14年

@nneonneo 単一のディレクトリで何百万ものファイルを操作する必要がありましたか?私はそれを持っていると信じています。それは簡単ではありません。の明らかな問題とは別にARG_MAX、これによりファイルの扱いが面倒になり、ファイルが中央サーバーに保存され、NFSと共有されている(不適切な)セットアップネットワークが実際に発生する可能性があります。全体のファイル数を減らすことに関しては、それよりもはるかに多くのファイルが必要になりますが、マルチユーザー設定では、iノードの数が実際に制限になる可能性があります。
terdon 2014年

より具体的な例として@nneonneoを使用tune2fs -lすると、$ HOMEを保持するパーティションで、19,300,352のiノードがあることがわかります。それ以上のファイルを作成することはできません。あなたが言ったように、10 ^ 6は狂っていません。あなたがしていることに依存して、あなたはそれ以上の方法の必要性を持つことができます。
terdon

@nneonneoは、inodeを簡単に使い果たす方法の実例について、更新された回答を参照してください。
terdon 2014年

私のサーバーは100万を超えるiノードを使用していますが、それは私がメトリックトンの電子メール(何年も前に遡る大量のトラフィックメーリングリスト)を持っているためであり、それをMaildir形式で保存します。1900万個のiノードを使用するために何ができるのか、私にはわかりません。7か月以上の間、毎秒24時間、新しいファイルを作成する必要があります。
psusi 2014年

4

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

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

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

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

最も人気のあるUnixアーカイバはですがtar、などの他にも存在cpioarます。(Debianパッケージはarアーカイブ cpioですが、最初のRAMディスクによく使用されます。)tarは、(。Z)compressgzip(。gz)、 bzip2(。bz2)、xz(。xz)などの圧縮ツールと、最も古いものから最も新しいものへと組み合わされています。 、そして偶然にも、最悪の圧縮から最高の圧縮まで。

作るtarアーカイブをし、それを圧縮するには、明確な手順は次のとおりです。コンプレッサーは、については何も知らないtarファイル形式を。つまり、圧縮されたtarアーカイブから単一のファイルを抽出するには、前述のすべてのファイルを解凍する必要があります。これはしばしば「固体」アーカイブと呼ばれます。

同様に、tarは「ストリーミング」形式であるため、パイプラインで使用するために必要です。tarアーカイブにはグローバルインデックスがなく、tarアーカイブの内容をリストすることは、それを抽出するのと同じくらいコストがかかります。

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

そこ異なるプラットフォームと哲学の間のクロス受粉は、次のとおりです。gzip基本的にあるzipのコンプレッサーは、そのアーカイバなし、かつxz本質的に7-zip「そのアーカイバなしのコンプレッサー。

他にも、専用のコンプレッサーがあります。PPMバリアントとその後継モデルZPAQは、リソースの消費に関係なく最大の圧縮が得られるように最適化されています。CPUとRAMは、必要な量だけ簡単に消費でき、解凍は圧縮と同じくらい負担になります(対照的に、最も広く使用されている圧縮ツールは 非対称です。解凍よりも圧縮の方が安価です)。

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


それであなたはどちらを選ぶべきですか?

アーカイブ:

あなたがUbuntuを使っているのでtar、他の場所で簡単に読めるファイルを作ろうとしているのでない限り、アーカイブ以外のものを使用する本当の理由はありません。

zipユビキタスを打ち負かすのは難しいですが、Unix中心ではなく、ファイルシステムのアクセス許可と所有権情報を保持しません。また、組み込まれた圧縮は時代遅れです。7-zipとRAR(およびZPAQ)はより最新の圧縮を備えていますが、Unixファイルシステムのアーカイブには同様に適していません(圧縮プログラムとしてそれらを使用することを妨げるものは何もありません)。RARも独自仕様です。

圧縮:

最大の圧縮を行うには、http://mattmahoney.net/dc/text.htmlにある巨大なベンチマークなどのベンチマークを確認できます。これにより、関連するトレードオフをよりよく理解できます。

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

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

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


1

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

Tar, cpio and paxアーカイバです:それらは一連のファイルとディレクトリを取り、データとメタデータを単一のファイルにエンコードします。タールは最も人気があり、互換性がありますが、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を数十KBに削減しましたが、lzmaは私が正しく覚えている場合、数10 MBを使用しました。


実際、lzmaは解凍がかなり高速です。
psusi 2014年

0

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

効果?xzlzmaまたはbzip2、および私の経験では、圧縮率はのそれよりもはるかに高速ですlzma。ただし、RAMの独占です。

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

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