Wie verwenden Sie grep mit großen (Millionen) Anzahl der Dateien, die Suche nach einer Zeichenkette und erhalten das Ergebnis in wenigen Minuten
Diese Frage ist in Bezug auf
Wie Sie mit grep effiziente?
Ich versuche, die Suche nach einem "string" in einem Ordner mit 8-10 Millionen kleine (~2-3kb) nur-text-Dateien. Ich muss wissen, Sie alle Dateien, die die "string".
Zuerst habe ich dieses
grep "string"
War super langsam.
Dann habe ich versucht
grep * "string" {} \; -print
Basierend auf verknüpfte Frage, ich habe dieses
find . | xargs -0 -n1 -P8 grep -H "string"
Bekomme ich diesen Fehler:
xargs: argument line too long
Kennt jemand eine Möglichkeit, diese Aufgabe relativ schneller?
Ich betreibe diese Suche auf einer server-Maschine, die mehr als 50 GB an RAM zur Verfügung steht, und 14 Kernen der CPU. Ich wünschte irgendwie ich könnte mit allen, die Verarbeitungsleistung zum ausführen dieser Suche schneller.
- Sie müssen wissen, in welcher Datei der string ist in? Oder ist es genug, um zu wissen, die Zeichenfolge in eine oder mehrere Dateien in das Verzeichnis?
- Ich muss wissen, alle die mit dem Namen, wo die Zeichenfolge gefunden wurde.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie entfernen
-0
argumentxargs
und bis-n
parameter statt:-n64
oder-n128
könnte eine realistischere Zahl.n
die Anzahl von Prozessen gleichzeitig verwendet werden?[-n max-args]
- und max-Prozesse ist -flag P:[-P max-procs]
Es nicht, dass große Stapel von Dateien (kudos to 10⁷-Dateien - eine messys Traum), aber ich erstellt 100k Dateien (400 MB in der Gesamtwertung) mit
gemacht und einige tests für die Reine Neugier (das Schlüsselwort 10 war ich auf der Suche ist nach dem Zufallsprinzip ausgewählt):
Btw. es gibt nicht einen großen Unterschied in der Laufzeit, wenn ich das unterdrücken der Ausgabe mit Rohrleitungen
STDOUT
zu/dev/null
. Ich bin mit Ubuntu 12.04 auf einem nicht so leistungsstarken laptop 😉Meine CPU ist Intel(R) Core(TM) i3-3110M CPU @ 2.40 GHz.
Mehr Neugier:
8 Millionen Dateien ist eine Menge in einem Verzeichnis! Aber 8 Millionen mal 2kb ist 16GB, und Sie haben 50 GB RAM. Ich bin am überlegen von einer RAMdisk...
Hast du so viel RAM, warum nicht Lesen es alle in den Speicher, und verwenden Sie einen regulären Ausdruck-Bibliothek zu suchen? Es ist ein einfaches C-Programm: