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 GNUgrepgefunden unter OS/X 10.8 und höher) folgt symbolischen Links, also selbst wenn es nur 100 GB an Dateien in~/Documentsgibt , 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 -rmit 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).
-
grepfindet die Zeilen, die dem Muster entsprechen. Dazu muss jeweils eine Zeile in den Speicher geladen werden. GNUgrepim Gegensatz zu vielen anderengrepImplementierungen 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-fileDas 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 "