私は非常に簡単な検索をしています。
grep -R Milledgeville ~/Documents
しばらくすると、次のエラーが表示されました。
grep: memory exhausted
これをどのように避けることができますか?
私のシステムには10GBのRAMがあり、実行中のアプリケーションがほとんどないため、単純なgrepでもメモリが不足する可能性があることに本当に驚きました。~/Documents
約100GB、さまざまなファイルが含まれています。
grep -RI
この問題はないかもしれませんが、バイナリファイルでも検索したいと思います。
ベストアンサー1
2つの潜在的な問題:
grep -R
(OS / X 10.8以降で見つかった修正されたGNUを除くgrep
)シンボリックリンクに従ってください。したがって、100 GBのファイルしか存在しない場合でも、~/Documents
シンボリックリンクが残っている可能性があります/
。たとえば、ファイルシステム全体を検索します。 ./dev/zero
最新のgrep -r
GNUと組み合わせて使用するgrep
か、標準構文を使用するには:find ~/Documents -type f -exec grep Milledgeville /dev/null {} +
(ただし、終了状態はパターンが一致したかどうかを反映しないことに注意してください。)
grep
パターンに一致する線を探します。これを行うには、メモリに一度に1行ずつロードする必要があります。grep
他の多くの実装とは異なり、GNUはgrep
読み取る行のサイズに制限はなく、バイナリファイル内の検索をサポートしています。そのため、ファイルに使用可能なメモリよりも大きな非常に大きな行(2行改行など)があると失敗します。これは通常スパースファイルで発生します。次のコマンドを使用して再現できます。
truncate -s200G some-file grep foo some-file
この問題は解決するのが難しいです。次のことができます(まだGNUを使用しています
grep
)。find ~/Documents -type f -exec sh -c 'for i do tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0" done' Milledgeville {} +
入力を提供する前に、一連のNUL文字を改行文字に変換してください
grep
。これは、スパースファイルによって問題が発生する状況を扱います。大容量ファイルに対してのみこれを実行して最適化できます。
find ~/Documents -type f \( -size -100M -exec \ grep -He Milledgeville {} + -o -exec sh -c 'for i do tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0" done' Milledgeville {} + \)
ファイルいいえ
grep
まれで古いバージョンのGNUを使用している場合は、2.6
このオプションを使用できます--mmap
。行はメモリにコピーされず、メモリにマップされます。つまり、システムは常にファイルページアウトを介してメモリを回復できます。このオプションはgrep
GNU 2.6から削除されました。