多数の非常に大きなファイル(80ギガバイトのGB)を圧縮しなければならないことに気づき、システムの速度(不足)に驚いています。約500 MB /分の変換速度が得られます。を使用してtop
、私は単一のCPUを約100%使用しているようです。
tar
ファイルの作成(80Gファイルの作成方法)には数分(おそらく5または10)しかかからなかったため、(ちょうど)ディスクアクセス速度ではないと確信していますが、2時間以上たっても私の単純なgzipコマンドはまだですまだ完成してない。
要約すれば:
tar -cvf myStuff.tar myDir/*
87 Gのtarファイルを作成するのに5分未満かかりました
gzip myStuff.tar
55G zipファイルを作成して、2時間10分かかりました。
私の質問:これは正常ですか?gzip
物事をスピードアップするための特定のオプションはありますか?コマンドを連結して使用する方が速いでしょうtar -cvfz
か?私はへの参照を見たpigz
- のgzipの並列実装をのでそれは私のためのオプションではありませんが、残念ながら私は私が使用しているマシンにソフトウェアをインストールすることはできません- 。たとえば、この前の質問を参照してください。
私はこれらのオプションのいくつかを自分で試して時間を計ります-しかし、オプションの「魔法の組み合わせ」に当たらない可能性が高いです。このサイトの誰かが物事をスピードアップするための正しいトリックを知っていることを望んでいます。
他のトライアルの結果が利用可能になったら、この質問を更新します-しかし、誰かが特に良いトリックを利用できるなら、本当に感謝します。おそらくgzipの処理時間は、私が思っていたよりも長くなります...
更新
約束されたように、圧縮の量を変更し、ファイルの宛先を変更するという、以下に提案するトリックを試しました。約4.1GBのtarに対して次の結果が得られました。
flag user system size sameDisk
-1 189.77s 13.64s 2.786G +7.2s
-2 197.20s 12.88s 2.776G +3.4s
-3 207.03s 10.49s 2.739G +1.2s
-4 223.28s 13.73s 2.735G +0.9s
-5 237.79s 9.28s 2.704G -0.4s
-6 271.69s 14.56s 2.700G +1.4s
-7 307.70s 10.97s 2.699G +0.9s
-8 528.66s 10.51s 2.698G -6.3s
-9 722.61s 12.24s 2.698G -4.0s
そのため、フラグをデフォルト-6
から最速に変更すると-1
、30%の速度向上が得られ、zipファイルのサイズは(データに対して)ほとんど変更されません。同じディスクを使用していても、別のディスクを使用していても本質的に違いはありません(統計的有意性を得るには、これを複数回実行する必要があります)。
興味のある方は、次の2つのスクリプトを使用してこれらのタイミングベンチマークを生成しました。
#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile
for i in {1..9}
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done
2番目のスクリプト(compressWith
):
#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz
注意すべき3つのこと:
- ので
/usr/bin/time
はなくを使用するのはtime
、組み込みコマンドのbash
オプションがGNUコマンドよりもはるかに少ないためです - この
--format
オプションを使用することはありませんが、ログファイルが読みやすくなります time
パイプシーケンスの最初のコマンドでのみ動作するように思われるので、スクリプトインスクリプトを使用しました(したがって、1つのコマンドのように見えました...)。
このすべてを学んだので、私の結論は
-1
フラグを使用して物事をスピードアップします(受け入れられた回答)- ディスクから読み取るよりもはるかに多くの時間がデータの圧縮に費やされます
- より高速な圧縮ソフトウェアに投資します(
pigz
良い選択のようです)。 - 圧縮するファイルが複数ある場合は、各
gzip
コマンドを独自のスレッドに入れて、使用可能なCPUをより多く使用できます(貧乏人pigz
)
このすべてを学ぶのを手伝ってくれたみんなに感謝します!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
マシンがどれだけ速く圧縮するかを示します。side-note2:結果を別のディスクに保存します。
man
ページの最後のものであり、それまで読んでいませんでした(「シングルレターコマンド」でソートされているため-#
) 。それはRTFMを教えてくれます!これは私が次に試みることです!
pigz
、インストールせずにビルドした場所からコンパイルして実行できることに注意してください。コンパイラーがない場合、別のコンピューターでクロスコンパイルできますが、それは価値があるかもしれないよりも多くの努力をし始めています。(より速く実行するためにこの圧縮がどれほどひどく必要かによって異なります。)