ログファイル処理間のパフォーマンス比較[閉じる]

ログファイル処理間のパフォーマンス比較[閉じる]

私は約10 GBのサイズの大容量ログファイルで作業しており、パターンマッチングにzgrepを使用しています。ところで、ユースケースが少し複雑になり、zgrepを使用できず、ロジックをawkに変更しました。

Time
using zgrep ~1.5 minutes
using awk ~11 minutes
using python ~ 13 minutes

考えられる解決策を見つけるためにGoogleで検索しようとしましたが、見つかりませんでした。 .gzファイルを効率的に解析する方法は?

入力例

String1:"Hello"
String2:"World"
String3:"Question"
End
String1:"HelloAgain"
String5:"Answer"
End
String1:"NewEntry"
String2:"Foo"
String5:"NewFile"
End

出力例

Hello World
HelloAgain
NewEntry Foo

これは元の質問です。シェルを使用して特定のパターンを繰り返す

ベストアンサー1

実行中の操作が個々の行のパターンマッチングだけである場合、速度はほとんど不可能ですgrep(またはzgrep基本的にはよりクールな実装にすぎません)。zcat | grepこれはgrep唯一の目的であり、何十年もの間その仕事に最適化されています。

grepこれができる唯一のことです。それが速すぎる理由の1つです。

これを行う必要がある場合(たとえば、行が特定のパターンと一致する場合はその行の一部を出力し、オプションで最初の条件がtrueで、2番目の行が他の行の他のパタ​​ーン部分と一致する場合 - アクション示されているように))、もしそうなら、これははるかに複雑であり、私たちのgrep能力を超えています。

これらの複雑さのレベルは、本質的に単純なパターンマッチングよりも遅い。これは避けられない。プログラムはより多くの作業を必要とし、常により多くの作業を必要とします。

それにもかかわらず、一部の言語は特定のタスクで他の言語よりも速く、少なくとも重要なことには、タスクを実装するために選択したアルゴリズム(タスクの実行方法など)がパフォーマンスに大きな影響を与える可能性があります。

中小ファイルで作業する場合は、パフォーマンスの違いが微妙で目立たない場合がありますが、大容量のファイルで作業する場合(または何千回も繰り返し実行する場合)、小さなパフォーマンスの違いでも合計され、パフォーマンスに大きな影響を与える可能性があります。疾走 。時間。

awkたとえば、perl元のシェルスクリプトはshと比較してはるかに遅いpython(数分ではなく数時間以上)。これは、shがこれらの操作をうまく実行できないためです。 shでは、ファイル内の入力データを繰り返すのが特に遅いです。シェルの主な目的は、それ自体が複雑なテキスト処理ではなく、対話型および/またはスクリプト操作を制御することです(bashその点で、zsh従来よりも強力ですが、shorなどの専用テキスト処理言語は常により速くて高速です)。awkperl

簡単に言うと:

  • 作業に最適なツールを選択してください
  • 優れた高速アルゴリズムを実装します。

ちなみに、「ベスト」は仕事に最適なツールであるだけでなく、それらのいくつかはあなたが最もよく知っているツールとその言語で必要なものを書くのがどれほど簡単かということです。たとえば、多くのタスクに対してawkほぼperl同様のパフォーマンス(awk通常は少し高速ですが、より多くのperl組み込み関数と考えられるほとんどすべてのタスクを実行できる巨大なコードベースがあります)CPAN)。 Perlよりもawkを知っているなら、awkを使用してください。その逆。

私は単純なタスクにはawkを使用し、より複雑なタスクにはPerlを使用する傾向があります。時々私はPythonを使用しますが、私が書いたほとんどのものはPythonよりもPerlに適しており、Pythonを知るよりもPerlをはるかによく知っています。

おすすめ記事