私は非常に単純な検索を行っていました:
grep -R Milledgeville ~/Documents
そしてしばらくすると、このエラーが発生しました:
grep: memory exhausted
どうすればこれを回避できますか?
システムに10GBのRAMがあり、実行中のアプリケーションがほとんどないので、単純なgrepのメモリが不足していることに本当に驚いています。 ~/Documents
約100GBで、あらゆる種類のファイルが含まれています。
grep -RI
この問題はないかもしれませんが、バイナリファイルも検索したいと思います。
承認された回答:
2つの潜在的な問題:
-
grep -R
(変更されたGNUgrep
を除く OS / X 10.8以降で見つかりました)はシンボリックリンクをたどるので、~/Documents
に100GBのファイルしかない場合でも 、/
へのシンボリックリンクがまだある可能性があります たとえば、/dev/zero
などのファイルを含むファイルシステム全体をスキャンすることになります。 。grep -r
を使用します 新しいGNUgrep
を使用 、または標準の構文を使用します:find ~/Documents -type f -exec grep Milledgeville /dev/null {} +
(ただし、終了ステータスは、パターンが一致しているかどうかを反映していないことに注意してください)。
-
grep
パターンに一致する線を見つけます。そのためには、一度に1行ずつメモリにロードする必要があります。 GNUgrep
他の多くの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