したがって、最大圧縮でディレクトリを圧縮する必要があります。
xz
を使用してどうすればよいですか? tar
だけではディレクトリを圧縮できないため、xz
も必要になります。作成するワンライナーはありますか? foo.tar.xz
?
xz
がコマンドラインフラグの標準セット-圧縮レベルフラグを含む-を尊重すると仮定すると、次のことを試すことができます。
tar -cf - foo/ | xz -9 -c - > foo.tar.xz
最近の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
/--extreme
mightは、一部のデータセットにいくつかの追加の圧縮の利点を与えます)。
XZ_OPT=-e9 tar cJf tarfile.tar.xz directory
XZ_OPT=-9e tar cJf tarfile.tar.xz directory
より良いです
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
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に設定し、深さも調整します)。
あなたはさまざまなオプションを試すかもしれませんが、私にとっては-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
tar
コマンドは、xzファイルに対してJ
フラグを使用します。例:
tar -cJvf foo.tar.xz foo/
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
一般的なラップトップの-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
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
また、これは圧縮レベルを選択するために役立ちます:
これは質問に対する正確な答えではありませんが、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形式はファイルシステムのアクセス許可を格納しない のため、個人用ファイル。
複数のスレッドを使用してこれをより速く完了させたいが、他の作業を実行しているときにシステムの速度を落とさない場合は、-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のメモリでいくつかの小さなサービスを実行している場合など、誤って影響を与える可能性があることです。
Mac OS Xでは、tar
でパラメーターを渡す別の方法は、--options=
フラグを使用することです。例えば、
tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName
最大圧縮率は、適用する機器の機能によって異なります。最大の圧縮を行うと、期間が完全に延長され、ハードウェアリソースに大きな負荷がかかります。このため、サーバーリソース(CPU/RAM/Disk)の使用を最大化することは推奨されません。その上で実行されている他のサービスの動作を遅くしないでください圧縮の程度とその期間/システム負荷の間の妥協点を考慮することは価値があります。
私の場合、ラップトップでxzを使用しました(したがって、最大のハードウェア機能を使用しました)。CPUスレッド、mem RAM制限およびディスクパフォーマンス)を最大限に選択しました。実験的に圧縮レベルを選択し、 DictSize = 32 MiBオプションで(私にとって)最適に機能しました。使用するコマンドの構文は次のとおりです
xz -k -8e -M 7000MB -T 8 -v sd-dump-rpi3b+-strech.img
どこ:
以下のprtscを参照してください。
私のラップトップの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
ソフトウェア:
man xzでxzの使用を最適化する可能性に関する詳細情報。