スペースを節約するために、ログファイルをgzipで圧縮しています。通常、私たちはそれらを圧縮したままにして、
gunzip -c file.gz | grep 'test'
重要な情報を見つけるためですが、ファイルを非圧縮のままにしてからgrepを実行する方が速いかどうか疑問に思っています。
cat file | grep 'test'
Gzipがメモリに読み込んで解凍すると理にかなっている場合、最初の方が高速で、そうでない場合は2番目の方が高速であるとgzipがどのように機能するかについて、いくつかの議論がありました。 gzipがデータを解凍する方法を知っている人はいますか?
それに関連するオーバーヘッドがないため、非圧縮ファイルをキャットする方が常に高速になります。一時ファイルを書き込んでいない場合でも、CPUを破壊する解凍動作を実行しています。これらのファイルに頻繁にアクセスする場合は、スペースがあれば非圧縮のままにしておくことをお勧めします。
つまり、データを標準出力(gunzip -c、zcatなど)にダンプしても、一時ファイルへの書き込みはトリガーされません。データはgrep
コマンドに直接パイプされます。このコマンドは、非圧縮ストリームをの独自の標準として扱います。
LZ *エンコーディングに関するウィキペディアの記事はこちらです: http://en.wikipedia.org/wiki/LZ77_and_LZ78 。
いつものように、実際の測定に勝るものはありません。
マイレージは異なる場合がありますが、私のシステムでは、すでに圧縮されていないファイルのgrepは、zcat
またはgunzip
をgrep
にパイプする場合の約3分の1の時間がかかりました。これは驚くべきことではありません。
Gzipをlzoに置き換えて、パフォーマンスを向上させることもできます。
LZOを使用すると、処理が速くなります(ディスクの入出力が少なくなり、CPUの圧縮オーバーヘッドが少なくなります)
gzip -dc | grep foo(またはgunzip -c)| grep fooがパイプに書き込みます。パイプの実装方法はオペレーティングシステムによって異なりますが、通常はメモリに残ります。他の人が指摘しているように、非圧縮ファイルのgrepは、圧縮データの解凍に時間がかかるため、常に高速になります。別の圧縮プログラムを使用すると、パフォーマンスが向上する場合と向上しない場合があります。いつでも測定できます。
圧縮を使用すると、実際にはより速いスループットをディスクに提供できますが、それは、使用する圧縮アルゴリズムや使用しているデータの種類など、さまざまな要因によって異なります。動き回ります。 [〜#〜] zfs [〜#〜] 、たとえば この仮定に大きく依存 。
gzipは、ファイル全体を一時的なものに解凍し、最後に名前を変更します(標準gzip -d myfile.gz
)または、一時ファイルをまったく使用しないで、一度に圧縮データのいくつかのブロックを読み取り、非圧縮データをstdoutに吐き出します(gzip -d -c...
)。
現代のシステムでは、私はgunzip | grep
一方、圧縮されていないファイルをgrepするよりも高速である可能性がありますgunzip | grep
は常にファイルを解凍してから、圧縮されていないファイルをgrepすることに勝ちます:)
ファイルサイズに依存:I/Oが支配的である場合、解凍を実行するCPUはファイル転送よりも時間がかかりません。 I/Oが支配的であるかどうかは、CPU、ストレージシステム、およびそれらの間の帯域幅の相対速度に大きく依存します。
また、余談ですが、grep -Z
別名zgrep
も便利です。