grep: メモリが使い果たされました。

grep: メモリが使い果たされました。

私は非常に簡単な検索をしています。

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 -rGNUと組み合わせて使用​​する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。行はメモリにコピーされず、メモリにマップされます。つまり、システムは常にファイルページアウトを介してメモリを回復できます。このオプションはgrepGNU 2.6から削除されました。

おすすめ記事