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 GNUgrep
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 Siegrep -r
mit neuerem GNUgrep
, 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. GNUgrep
im Gegensatz zu vielen anderengrep
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 "