GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Grep:Speicher erschöpft?

Ich habe eine sehr einfache Suche durchgeführt:

grep -R Milledgeville ~/Documents

Und nach einiger Zeit erschien dieser Fehler:

grep: memory exhausted

Wie kann ich das vermeiden?

Ich habe 10 GB RAM auf meinem System und nur wenige Anwendungen laufen, also bin ich wirklich überrascht, dass einem einfachen grep der Speicher ausgeht. ~/Documents ist etwa 100 GB groß und enthält alle Arten von Dateien.

grep -RI Dieses Problem tritt möglicherweise nicht auf, aber ich möchte auch in Binärdateien suchen.

Akzeptierte Antwort:

Zwei mögliche Probleme:

  • grep -R (mit Ausnahme des modifizierten GNU grep gefunden unter OS/X 10.8 und höher) folgt symbolischen Links, also selbst wenn es nur 100 GB an Dateien in ~/Documents gibt , gibt es möglicherweise noch einen symbolischen Link zu / zum Beispiel und Sie werden am Ende das gesamte Dateisystem scannen, einschließlich Dateien wie /dev/zero . Verwenden Sie grep -r mit neuerem GNU grep , oder verwenden Sie die Standard-Syntax:

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

    (Beachten Sie jedoch, dass der Exit-Status nicht die Tatsache widerspiegelt, ob das Muster übereinstimmt oder nicht).

  • grep findet die Zeilen, die dem Muster entsprechen. Dazu muss jeweils eine Zeile in den Speicher geladen werden. GNU grep im Gegensatz zu vielen anderen grep Implementierungen haben keine Begrenzung der Größe der gelesenen Zeilen und unterstützen die Suche in Binärdateien. Wenn Sie also eine Datei mit einer sehr großen Zeile haben (d. h. mit zwei Zeilenumbrüchen, die sehr weit voneinander entfernt sind), die größer als der verfügbare Speicher ist, schlägt sie fehl.

    Das würde normalerweise mit einer Sparse-Datei passieren. Sie können es reproduzieren mit:

    truncate -s200G some-file
    grep foo some-file
    

    Das ist schwer zu umgehen. Sie könnten es so machen (immer noch mit GNU grep ):

    find ~/Documents -type f -exec sh -c 'for i do tr -s "
    
Linux
  1. So verwenden Sie den Grep-Befehl, um Text in Dateien zu finden

  2. Pipe zu mehreren Dateien in der Shell?

  3. .o-Dateien vs. .a-Dateien

  4. Suchen nach einer Zeichenfolge in mehreren Dateien unter Linux

  5. Verwenden von Dateien für Shared Memory IPC

Grep-Befehl in Linux (Text in Dateien suchen)

So führen Sie eine Mustersuche in Dateien mit Grep durch

Finden Sie Text in Dateien unter Linux mit grep

So führen Sie eine Grep-Suche für alle Dateien und in allen Verzeichnissen durch

Ausführbare Dateien mit ls und grep finden

Verwenden Sie einen Index, um grep schneller zu machen?