GNU/Linux >> Linux の 問題 >  >> Linux

Grep:メモリが使い果たされましたか?

私は非常に単純な検索を行っていました:

grep -R Milledgeville ~/Documents

そしてしばらくすると、このエラーが発生しました:

grep: memory exhausted

どうすればこれを回避できますか?

システムに10GBのRAMがあり、実行中のアプリケーションがほとんどないので、単純なgrepのメモリが不足していることに本当に驚いています。 ~/Documents 約100GBで、あらゆる種類のファイルが含まれています。

grep -RI この問題はないかもしれませんが、バイナリファイルも検索したいと思います。

承認された回答:

2つの潜在的な問題:

  • grep -R (変更されたGNU grepを除く OS / X 10.8以降で見つかりました)はシンボリックリンクをたどるので、~/Documentsに100GBのファイルしかない場合でも 、/へのシンボリックリンクがまだある可能性があります たとえば、/dev/zeroなどのファイルを含むファイルシステム全体をスキャンすることになります。 。 grep -rを使用します 新しいGNUgrepを使用 、または標準の構文を使用します:

    find ~/Documents -type f -exec grep Milledgeville /dev/null {} +
    

    (ただし、終了ステータスは、パターンが一致しているかどうかを反映していないことに注意してください)。

  • grep パターンに一致する線を見つけます。そのためには、一度に1行ずつメモリにロードする必要があります。 GNU grep 他の多くのgrepとは対照的に 実装には、読み取る行のサイズに制限がなく、バイナリファイルでの検索をサポートします。したがって、使用可能なメモリよりも大きい、非常に大きな行(つまり、2つの改行文字が非常に遠くにある)のファイルがある場合、そのファイルは失敗します。

    これは通常、スパースファイルで発生します。あなたはそれを次のように再現することができます:

    truncate -s200G some-file
    grep foo some-file
    

    それを回避するのは難しいです。あなたはそれを(まだGNU grepで)行うことができます ):

      find〜/ Documents -type f -exec sh -c'for i do tr -s "
    
Linux
  1. .o ファイルと .a ファイル

  2. wc gzipファイル?

  3. Linux で複数のファイル内の文字列を検索する

  1. 共有メモリ IPC 用のファイルの使用

  2. インデックスを使用してgrepを高速化しますか?

  3. Linux でのプロセス メモリ使用量のグラフ化

  1. PDFファイルをgrepする方法は?

  2. ファイル内の単語をGrepしてから、ファイルをコピーしますか?

  3. シェル内の複数のファイルにパイプしますか?