142
 grep -i -A 5 -B 5 'db_pd.Clients'  eightygigsfile.sql

これは、他の方法では過負荷にならないかなり強力な Linux サーバーで 1 時間実行されています。grep に代わるものはありますか? 構文について改善できることはありますか (egrep、fgrep の方が良いですか?)

ファイルは実際には別のサーバーへのマウントと共有されているディレクトリにありますが、実際のディスクスペースはローカルであるため、違いはありませんか?

grep は最大 93% の CPU を使用しています

4

6 に答える 6

182

以下にいくつかのオプションを示します。

LC_ALL=C1) UTF-8 の代わりに C ロケールを使用するには、grep コマンドの前に を付けます。

2)fgrep正規表現ではなく、固定文字列を検索するために使用します。

-i3)不要な場合は、オプションを削除します。

したがって、コマンドは次のようになります。

LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql

ファイルを RAM ディスクにコピーすると、さらに高速になります。

于 2012-12-17T11:25:46.683 に答える
40

マルチコア CPU を使用している場合は、GNU parallelを強くお勧めします。大きなファイルを並行して grep するには、次を使用します。

< eightygigsfile.sql parallel --pipe grep -i -C 5 'db_pd.Clients'

ディスクと CPU によっては、より大きなブロックを読み取る方が高速な場合があります。

< eightygigsfile.sql parallel --pipe --block 10M grep -i -C 5 'db_pd.Clients'

あなたの質問からは完全には明らかではありませんが、その他のオプションにgrepは次のものがあります。

  • -iフラグをドロップします。
  • -F固定文字列のフラグの使用
  • NLS を無効にするLANG=C
  • -mフラグで一致の最大数を設定します。
于 2012-12-17T12:49:49.480 に答える
10

いくつかの些細な改善:

  • 可能であれば -i オプションを削除してください。大文字と小文字を区別しないと非常に遅くなります。

  • .を置き換えます\.

    単一のポイントは、任意の文字に一致する正規表現記号ですが、これも遅いです

于 2012-12-17T11:19:21.613 に答える
3

2行の攻撃:

  • 確かに、あなたはそれを必要としますか-i、それともそれを取り除く可能性がありますか?
  • 遊ぶコアがもっとありますか?grepはシングルスレッドであるため、異なるオフセットでそれらの多くを開始することをお勧めします。
于 2012-12-17T11:18:06.523 に答える