私は時々bzip2に変換しなければならないたくさんのgzipファイルを持っています。現在、私は単純に各ファイルを「gunzip」してから「bzip2」であるシェルスクリプトを使用しています。この作品が、それはとりたくさん完了するまでに時間を。
このプロセスをより効率的にすることは可能ですか?ダイビングをして、必要に応じてgunzipおよびbzip2のソースコードを調べる準備ができていますが、見返りを確認したいだけです。プロセスの効率を改善する希望はありますか?
私は時々bzip2に変換しなければならないたくさんのgzipファイルを持っています。現在、私は単純に各ファイルを「gunzip」してから「bzip2」であるシェルスクリプトを使用しています。この作品が、それはとりたくさん完了するまでに時間を。
このプロセスをより効率的にすることは可能ですか?ダイビングをして、必要に応じてgunzipおよびbzip2のソースコードを調べる準備ができていますが、見返りを確認したいだけです。プロセスの効率を改善する希望はありますか?
回答:
あるステップでgunzipを実行し、別のステップでbzip2を実行するのではなく、パイプを使用した方が効率的かもしれません。何かのようなものgunzip --to-stdout foo.gz | bzip2 > foo.bz2
私は2つ以上のCPUで考えています、これは間違いなくより速くなるでしょう。しかし、おそらく単一のコアだけでも。でも、これを試していないのは恥ずかしいことですが。
bzip2
及びgzip
パイプが暗黙のうちに二つのプロセス、起動するので、内部的に並行して作業をしないで、パイプを使用することによって、あなたは、並列に仕事を持つことができます並行して実行します。したがって、少なくとも解凍と圧縮は並行して実行されます。
bzip2
のCPU使用率はgunzip
1を下回るので、実際にはここで得られる並列処理は最小限です。ただし、ディスクIOを実行しなくてもよいのは依然として素晴らしいことです。
複数のコア(または複数のマシン)がある場合は、GNUパラレル(http://www.gnu.org/software/parallel)がオプションになる場合があります。
ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"
詳細とオプションについては、チュートリアル/ manページをご覧ください。
あなたが現在やっていることはあなたの最善の策です。利用可能な変換ツールはなく、すでにgzipされたファイルをbzip2しようとすることは、しばしば望ましくない影響を与えるため、実際にはオプションではありません。アルゴリズムが異なるため、変換には関係なく元のデータを取得する必要があります。もちろん、gzip圧縮はbzip2プロセスのステップでしたが、残念ながらそうではありません。
gzip
Leimpel-Ziv 77をbzip2
使用し、Burrows-Wheeler を使用します。別のアルゴリズム、私は恐れています。
時々、ログファイルを使って同じことをする必要があります。最初に、最小の* .gzファイル(ls -rS
)、gunzip、次にbzip2から個別に始めます。gunzip出力をbzip2入力に直接送信できるかどうかはわかりません。bzip2コマンドは、圧縮時にgunzipが解凍よりもはるかに遅いため、ホストのメモリとスワップ領域を消費する可能性があります。
改善や提案は大歓迎です。これが私のワンライナーです:
for i in $(ls -rS *.gz | sed 's/\.gz//'); do gunzip ${i}.gz; bzip2 -9 ${i}; done
数が多い場合は、LJの記事ですばらしいシェルスクリプトを確認してください。
http://linuxgazette.net/123/bechtel.html
7zipは圧縮率が高く、マルチスレッドです。
pbzip2
言及いただきありがとうございます。リンクが他のユーザーに読み込まれない場合のために、ここにプロジェクトページとマニュアルページがあります。