gzipファイルをbzip2に効率的に変換する


10

私は時々bzip2に変換しなければならないたくさんのgzipファイルを持っています。現在、私は単純に各ファイルを「gunzip」してから「bzip2」であるシェルスクリプトを使用しています。この作品が、それはとりたくさん完了するまでに時間を。

このプロセスをより効率的にすることは可能ですか?ダイビングをして、必要に応じてgunzipおよびbzip2のソースコードを調べる準備ができていますが、見返りを確認したいだけです。プロセスの効率を改善する希望はありますか?

回答:


1

この質問は、pbzip2が利用できないか、stdinから圧縮できない場合にずっと前に尋ねられましたが、(bzip2の代わりに)parallelpbzip2を使用し、圧縮解除ステップと圧縮ステップの両方を並列化できるようになりました

ls *.gz | parallel "gunzip -c {} | pbzip2 -c > {.}.bz2"

これは、bzip2を使用するよりも大幅に高速です。


こんにちは、今日の質問に出くわした人々にとって最良の選択肢となるので、これを受け入れられた回答に変更しました。pbzip2言及いただきありがとうございます。リンクが他のユーザーに読み込まれない場合のために、ここにプロジェクトページマニュアルページがあります
サンダー-モニカを

15

あるステップでgunzipを実行し、別のステップでbzip2を実行するのではなく、パイプを使用した方が効率的かもしれません。何かのようなものgunzip --to-stdout foo.gz | bzip2 > foo.bz2

私は2つ以上のCPUで考えています、これは間違いなくより速くなるでしょう。しかし、おそらく単一のコアだけでも。でも、これを試していないのは恥ずかしいことですが。


2
パイピングの+1、ディスクI / Oは避けたいものです。圧縮に関しては、私が誤解していない限り、bzip2は並列ではありません。あなたはparallellに圧縮するpbzip2のようなものを使用する必要があるだろう:compression.ca/pbzip2
gustafc

...そして残念ながら、利用可能な並列gzip解凍ユーティリティはないようです。
gustafc 2009

@gustafc:pbzip2へのリンクをありがとう、それはとても役に立ちました... @OP:パイプからそれらを失うことなく、破損したgzファイルなどを処理できるようにしたいので、bcosのパイピングを回避しました...
サンダー-モニカを復活させる'08 / 08/18

4
@gustafc:場合でも、bzip2及びgzipパイプが暗黙のうちに二つのプロセス、起動するので、内部的に並行して作業をしないで、パイプを使用することによって、あなたは、並列に仕事を持つことができます並行して実行します。したがって、少なくとも解凍と圧縮は並行して実行されます。
sleske 2011

1
@sleske、理論的には正しいですが、bzip2のCPU使用率はgunzip1を下回るので、実際にはここで得られる並列処理は最小限です。ただし、ディスクIOを実行しなくてもよいのは依然として素晴らしいことです。
Johan Walles 2017

6

複数のコア(または複数のマシン)がある場合は、GNUパラレル(http://www.gnu.org/software/parallel)がオプションになる場合があります。

ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"

詳細とオプションについては、チュートリアル/ manページをご覧ください。


3

あなたが現在やっていることはあなたの最善の策です。利用可能な変換ツールはなく、すでにgzipされたファイルをbzip2しようとすることは、しばしば望ましくない影響を与えるため、実際にはオプションではありません。アルゴリズムが異なるため、変換には関係なく元のデータを取得する必要があります。もちろん、gzip圧縮はbzip2プロセスのステップでしたが、残念ながらそうではありません。


アルゴリズムはありませんどの私もbzipで圧縮して1つのGZIP圧縮解除のステップと同じをスキップできることが、このようなオーバーラップの手順を?
サンダー-モニカを復活させる'08 / 08/19

2
@sundar私はそうは思いません。gzipLeimpel-Ziv 77をbzip2使用し、Burrows-Wheeler を使用します。別のアルゴリズム、私は恐れています。
new123456

2

時々、ログファイルを使って同じことをする必要があります。最初に、最小の* .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

入力をありがとう、2つのプロセス間の速度の違いとその意味に関するポイントは重要です。
sundar-モニカを


1

数分前にこれを行わなければなりませんでした:

find . -name "*.gz" | perl -pi -e 's/\.gz$//g;' | xargs -n1 ./rezip

どこrezipとして定義されます:

#!/bin/bash
gunzip -v $1.gz && bzip2 -9v $1

オプションで、で-Pオプションを使用してマルチスレッドにすることもできますがxargs、そのオプションには注意してください。(低いスタート!)

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