web-dev-qa-db-ja.com

gunzipはメモリ内で機能しますか、それともディスクに書き込みますか?

スペースを節約するために、ログファイルをgzipで圧縮しています。通常、私たちはそれらを圧縮したままにして、

gunzip -c file.gz | grep 'test'

重要な情報を見つけるためですが、ファイルを非圧縮のままにしてからgrepを実行する方が速いかどうか疑問に思っています。

cat file | grep 'test'

Gzipがメモリに読み込んで解凍すると理にかなっている場合、最初の方が高速で、そうでない場合は2番目の方が高速であるとgzipがどのように機能するかについて、いくつかの議論がありました。 gzipがデータを解凍する方法を知っている人はいますか?

7
Ryan Detzel

それに関連するオーバーヘッドがないため、非圧縮ファイルをキャットする方が常に高速になります。一時ファイルを書き込んでいない場合でも、CPUを破壊する解凍動作を実行しています。これらのファイルに頻繁にアクセスする場合は、スペースがあれば非圧縮のままにしておくことをお勧めします。

つまり、データを標準出力(gunzip -c、zcatなど)にダンプしても、一時ファイルへの書き込みはトリガーされません。データはgrepコマンドに直接パイプされます。このコマンドは、非圧縮ストリームをの独自の標準として扱います。

LZ *エンコーディングに関するウィキペディアの記事はこちらです: http://en.wikipedia.org/wiki/LZ77_and_LZ78

4
McJeff

いつものように、実際の測定に勝るものはありません。

マイレージは異なる場合がありますが、私のシステムでは、すでに圧縮されていないファイルのgrepは、zcatまたはgunzipgrepにパイプする場合の約3分の1の時間がかかりました。これは驚くべきことではありません。

Gzipをlzoに置き換えて、パフォーマンスを向上させることもできます。

LZOを使用すると、処理が速くなります(ディスクの入出力が少なくなり、CPUの圧縮オーバーヘッドが少なくなります)

1
Vi.

gzip -dc | grep foo(またはgunzip -c)| grep fooがパイプに書き込みます。パイプの実装方法はオペレーティングシステムによって異なりますが、通常はメモリに残ります。他の人が指摘しているように、非圧縮ファイルのgrepは、圧縮データの解凍に時間がかかるため、常に高速になります。別の圧縮プログラムを使用すると、パフォーマンスが向上する場合と向上しない場合があります。いつでも測定できます。

1
Rob Shinn

圧縮を使用すると、実際にはより速いスループットをディスクに提供できますが、それは、使用する圧縮アルゴリズムや使用しているデータの種類など、さまざまな要因によって異なります。動き回ります。 [〜#〜] zfs [〜#〜] 、たとえば この仮定に大きく依存

gzipは、ファイル全体を一時的なものに解凍し、最後に名前を変更します(標準gzip -d myfile.gz)または、一時ファイルをまったく使用しないで、一度に圧縮データのいくつかのブロックを読み取り、非圧縮データをstdoutに吐き出します(gzip -d -c...)。

現代のシステムでは、私はgunzip | grep一方、圧縮されていないファイルをgrepするよりも高速である可能性がありますgunzip | grepは常にファイルを解凍してから、圧縮されていないファイルをgrepすることに勝ちます:)

1
Luke404

ファイルサイズに依存:I/Oが支配的である場合、解凍を実行するCPUはファイル転送よりも時間がかかりません。 I/Oが支配的であるかどうかは、CPU、ストレージシステム、およびそれらの間の帯域幅の相対速度に大きく依存します。

また、余談ですが、grep -Z別名zgrepも便利です。

0
pjz