0

大きなログ ファイルが多数あります (各ログ ファイルは約 200 MB で、合計 200 GB のデータがあります)。

10 分ごとに、サーバーは約 10,000 個のパラメーター (タイムスタンプ付き) をログ ファイルに書き込みます。10,000 個の各パラメーターのうち、100 個を新しいファイルに抽出したいと考えています。

最初に1つのパラメーターでgrepを使用し、次にLC_ALL=C少し高速化し、次にfgrepを使用しましたが、これもわずかに高速でした。次に、パラレルを使用しました

parallel -j 2 --pipe --block 20M

そして最後に、200MB ごとに、5 秒で 1 つのパラメーターを抽出することができました。

しかし.. 1つのgrepで複数のパラメータをパイプすると

parallel -j 2 --pipe --block 20M "egrep -n 'param1|param2|...|param100" < log.txt

その後、grep 操作の時間が直線的に増加しました (現在、1 つのファイルを grep するのにかなりの時間がかかります)。(複数のパイプにegrepを使用する必要があったことに注意してください。どういうわけか、grepはそれらを気に入らなかったのです)。

この問題を解決するためのより速い/より良い方法はありますか?

探しているパターンは固定されているため、正規表現を使用する必要がないことに注意してください。特定の文字列を含む特定の行を抽出したいだけです。

4

2 に答える 2

1

上記のコメントを反映して、別のテストを行いました。コマンドからファイルを取得しましmd5deep -rZた (サイズ: 319MB)。ランダムに選択された 100 個の md5 チェックサム (それぞれ 32 文字の長さ)。

time egrep '100|fixed|strings' md5 >/dev/null

時間

real    0m16.888s
user    0m16.714s
sys     0m0.172s

のために

time fgrep -f 100_lines_patt_file md5 >/dev/null

時間は

real    0m1.379s
user    0m1.220s
sys     0m0.158s

egrep の約 15 倍高速です。

egrepしたがって、IMHOとの間で 0.3 秒の改善しか得られない場合、それは次のことをfgrep意味します。

  • あなたのIOは遅いです

egrep の計算時間は、プロセッサやメモリによって遅くなることはありませんが、IO と (IMHO) によって遅くなることはありませんfgrep

于 2013-07-04T18:16:43.627 に答える