web-dev-qa-db-ja.com

最大圧縮を使用してTARでディレクトリをXZする方法

したがって、最大圧縮でディレクトリを圧縮する必要があります。

xzを使用してどうすればよいですか? tarだけではディレクトリを圧縮できないため、xzも必要になります。作成するワンライナーはありますか? foo.tar.xz

122
LanceBaynes

xzがコマンドラインフラグの標準セット-圧縮レベルフラグを含む-を尊重すると仮定すると、次のことを試すことができます。

tar -cf - foo/ | xz -9 -c - > foo.tar.xz 
90
Shadur

最近のGNU tar bashまたは派生シェルで:

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

tarの小文字のjスイッチはbzipを使用し、大文字のJスイッチはxzを使用します。

XZ_OPT環境変数を使用すると、xzなどの呼び出し側アプリケーションを介して渡すことができないtarオプションを設定できます。

これは現在maximalです。

見る man xz設定できるその他のオプション(-e/--extrememightは、一部のデータセットにいくつかの追加の圧縮の利点を与えます)。

XZ_OPT=-e9 tar cJf tarfile.tar.xz directory
158
bsd
XZ_OPT=-9e tar cJf tarfile.tar.xz directory

より良いです

XZ_OPT=-9 tar cJf tarfile.tar.xz directory
14
Evandro Jr

16 GiB of RAM(そして何も実行されていない))がある場合、次のことを試すことができます:

tar -cf - foo/ | xz --lzma2=dict=1536Mi,Nice=273 -c - > foo.tar.xz 

これには1.5 GiB解凍の場合、約11倍の圧縮が必要です。メモリ量が少ない場合はそれに応じて調整してください。

これは、データが実際にそれだけ大きい場合にのみ役立ち、いずれの場合も役立ちません[〜#〜] that [〜#〜]多く、しかしそれでも...

バイナリを圧縮する場合は、最初のxzオプションとして--x86を追加します。 「マルチメディア」ファイル(非圧縮のオーディオまたはビットマップ)で再生している場合は、-delta = dist = 2で試すことができます(値の実験、1..4が適切です)。

冒険したい場合は、次のようなLZMAオプションを試してみてください。

--lzma2=dict=1536Mi,Nice=273,lc=3,lp=0,pb=2

(これらはデフォルト設定です。0〜4の値を試すことができます。lc+ lpは4を超えてはなりません)

デフォルトのプリセットがこれらの値にどのようにマッピングされるかを確認するには、ソースファイルsrc/liblzma/lzma/lzma_encoder_presets.cを確認します。ただし、それほど重要なことは何もありません(-eは、Niceの長さを273に設定し、深さも調整します)。

10
Anonymous

あなたはさまざまなオプションを試すかもしれませんが、私にとっては-4eの方がうまくいきます

tar cf - wam_GG_${dir}.nc | xz -4e > wam_GG_${dir}.nc.tar.xz 

私は実行してテストしました:

$ tar -cf - wam_GG.nc | xz -4e > wam_GG.nc.xz
$ tar -cf - wam_GG.nc | xz -9e > wam_GG.nc.xz.2

したがって、オプション-4eは-9eよりも少し優れているようです。

$ ll wam_GG.nc.xz*
-rw-rw-r--. 1 504 504 2707596 Jan 16  2015 wam_GG.nc.xz
-rw-rw-r--. 1 504 504 2708416 Jan 16  2015 wam_GG.nc.xz.2
6

tarコマンドは、xzファイルに対してJフラグを使用します。例:

tar -cJvf foo.tar.xz foo/

5
leonardoav

tar --help-I, --use-compress-program=PROG

tar -I 'xz -9' -cvf foo.tar.xz foo/  
tar -I 'gzip -9' -cvf foo.tar.gz foo/    

また外部コンプレッサーで圧縮します:

tar -I 'lz4 -9' -cvf foo.tar.lz4 foo/
tar -I 'zstd -19' -cvf foo.tar.zst foo/

外部コンプレッサーを解凍します:

tar -I lz4 -xvf foo.tar.lz4  
tar -I zstd -xvf foo.tar.zst  

アーカイブ外部コンプレッサーのリスト:

tar -I lz4 -tvf foo.tar.lz4
tar -I zstd -tvf foo.tar.zst
5
Goran Dragic

一般的なラップトップの-e9と比較すると、-9は、圧縮時に0.4%小さく、圧縮時に20%遅く、解凍時に3%遅くなります。ここでは、Pythonソースコードのディレクトリ構造で実行されるタイミングを示します。

圧縮:

$ Tbefore=`date +%s%3N` && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
43.87
$ Tbefore=`date +%s%3N` && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
53.861

減圧:

$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.e9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.443

ファイルサイズ:

$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf Python-3.6.0.tar.xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.49
$ ls -al ?ython*
-rw-rw-r-- 1 hobs hobs 16378500 Dec 23 13:06 python3.6.tar.9xz
-rw-rw-r-- 1 hobs hobs 16314420 Dec 23 13:05 python3.6.tar.e9xz
-rw-rw-r-- 1 hobs hobs 16805836 Dec 23 12:24 Python-3.6.0.tar.xz
3
hobs

Xz-utilsのバージョンv5.2.0のマルチコアマシンで、以下を確認します。

-T, --threads=NUM   use at most NUM threads; the default is 1; set to 0

最大数のコアと最大の圧縮を使用する場合:

export XZ_DEFAULTS="-9 -T 0 "

または、-Tを使用するコアの数に設定します。

次に:

tar cJf target.tar.xz source

また、これは圧縮レベルを選択するために役立ちます:

https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO

2
mirix

これは質問に対する正確な答えではありませんが、2つではなく1つのコマンドを使用できます。

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1

「ultras ettings」を使用して、ディレクトリ「dir1」からアーカイブarchive.7zにすべてのファイルを追加します

サポートされているその他の形式は、Zip、gzip、bzip2、またはtarです。これのために7z-t
-ソースman 7z

注:しないでくださいこのコマンドを使用してシステムファイルをバックアップします 7z形式はファイルシステムのアクセス許可を格納しない のため、個人用ファイル。

1
Edward Torvalds

複数のスレッドを使用してこれをより速く完了させたいが、他の作業を実行しているときにシステムの速度を落とさない場合は、-Tnを追加してみてください。nは使用するスレッドの数とNice圧縮をアイドル優先順位に降格します。

モデル(4スレッド用):

tar c foo/ | Nice -n19 xz -9 -T4 > foo.tar.xz

大きなディレクトリ(数GB)でこれを行う場合は、topまたはhtopで監視してみてください。うまくいけば、Nice値が19(優先度が最も低い)のいくつかのxzスレッドが表示されるはずです。

また、次のように、これを単純化して簡潔にしています。たとえば、tarのデフォルトの出力はstdoutなので、他の回答の-f -は必要ありません。

TarプロセスをNiceすることもできますが、xzは常にパイプラインのCPUをボトルネックにするため、必要なことはありませんでした。

実用的な注意として、CPUや時間によるものではなく、高いメモリ要求のため、xz -9を使用することはほとんどありません。 https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Memory_requirements_on_compression をご覧ください。 xzコンプレッサーは、bzip2と同様ですが、gzipとは異なり、より多くのメモリを使用してより高い圧縮率を実現します。 xzと組み合わせると、他のコンプレッサーよりもはるかに多くのメモリを使用し、最大600 MB以上のメモリを簡単に使用できます。また、-Tを使用してスレッド圧縮を有効にすると、メモリ要求がさらに増加し​​ます。注意する必要があるのは、小さなVM 1-2 GBのメモリでいくつかの小さなサービスを実行している場合など、誤って影響を与える可能性があることです。

1
Joshua Huber

Mac OS Xでは、tarでパラメーターを渡す別の方法は、--options=フラグを使用することです。例えば、

tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName
1
Samuel Li

最大圧縮率は、適用する機器の機能によって異なります。最大の圧縮を行うと、期間が完全に延長され、ハードウェアリソースに大きな負荷がかかります。このため、サーバーリソース(CPU/RAM/Disk)の使用を最大化することは推奨されません。その上で実行されている他のサービスの動作を遅くしないでください圧縮の程度とその期間/システム負荷の間の妥協点を考慮することは価値があります。

私の場合、ラップトップでxzを使用しました(したがって、最大のハードウェア機能を使用しました)。CPUスレッド、mem RAM制限およびディスクパフォ​​ーマンス)を最大限に選択しました。実験的に圧縮レベルを選択し、 DictSize = 32 MiBオプションで(私にとって)最適に機能しました。使用するコマンドの構文は次のとおりです

xz -k -8e -M 7000MB -T 8 -v sd-dump-rpi3b+-strech.img

どこ:

  • -k-圧縮
  • -8e-圧縮レベル
  • -M-RAM使用制限(GB))
  • -T-使用されたプロセッサスレッドの数
  • -v-詳細モード-データの圧縮の進行状況を表示します

以下のprtscを参照してください。

enter image description here

私のラップトップのSDメモリからの読み取り速度の制限(最大〜28 MB/s)のため、私は意図的にオンザフライで圧縮を使用しませんでした(パイプは使用していません)。 ddコマンドを使用して、sdカードからssdディスクにシステムイメージをダンプしました

Sudo dd bs=4M if=/dev/mmcblk0 > ~/Desktop/sd-dump-rpi3b+-strech.img

または、dd構文を完全に使用したオプション:

Sudo dd bs=4M if=/dev/mmcblk0 of=~/Desktop/sd-dump-rpi3b+-strech.img

そしてそれを圧縮しました。このように、私はsdカードであるデータ転送速度のボトルネックを回避し、最大値を使用しました:CPUスレッド、メモリRAMおよびSSD(読み取り/書き込み〜540 MB/s))

使用されるsdカードの容量が32GBであり、システムがその上で3.6GBを使用するという事実を考慮することは価値があります。カードダンプの重量は、圧縮前は約29 GB、圧縮後は約1.7 GBです。空のカードスペースは〜28.4GBで、これも〜3.6GBのデータ(主にバイナリファイル)で圧縮されています。 3.6から1.7を想定すると、50%強の圧縮が得られます。これは、約15分の圧縮時間で満足できる効果です。このプロセス中に、最初の計算から約45分で圧縮時間が急速に短縮され、SSDディスクの瞬間的な使用が最大で約266MB /秒(インパルス)に増加したため、意図的に空き領域の圧縮をスキップしました。

高レベルの圧縮では、多数のCPUスレッド(たとえば、私にとっては-9eで8スレッド)とRAMが適切に使用できない)の結果、削減されることに言及する価値がありますスレッド数xz(宣言されたメモリ使用制限を超えないこと)。

RAMメモリ制限とCPUスレッドの量を適切に選択すると、ハードウェアリソース(CPUとRAM)を使い果たすことなく、適切なパフォーマンスと高速圧縮を維持できます。

私はこの研究でこれを使用しています:hardware

IdeaPad Z580

  • i7-3632QM
  • 2 x 4 GB SODIMM DDR3同期PC3-12800(1600 MHz)
  • SSD IRSSDPRS25A120

ソフトウェア:

  • Debianストレッチ(x86_64)
  • カーネル4.9.0-11-AMD64
  • xz(XZ Utils)5.2.2
  • liblzma 5.2.2

man xzでxzの使用を最適化する可能性に関する詳細情報。

0