grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
Dies läuft seit einer Stunde auf einem ziemlich leistungsfähigen Linux-Server, der sonst nicht überlastet ist. Irgendeine Alternative zu grep? Irgendetwas an meiner Syntax, das verbessert werden kann (egrep, fgrep besser?)
Die Datei befindet sich tatsächlich in einem Verzeichnis, das für einen Mount auf einem anderen Server freigegeben ist, aber der tatsächliche Speicherplatz ist lokal, sodass dies keinen Unterschied machen sollte.
Der Grep greift nach bis zu 93% der CPU
-i
Switch den Prozess verlangsamen. Versuchen Sie es ohne-i
oder mitLC_ALL=C grep ...
. Wenn Sie nur nach einer festen Zeichenfolge suchen, verwenden Siegrep -F
.cindex .
um dann Ihren aktuellen Ordner zu indizierencsearch db_pd.Clients
.Antworten:
Hier sind einige Optionen:
1) Stellen Sie Ihrem Befehl grep das Präfix vor
LC_ALL=C
, um das Gebietsschema C anstelle von UTF-8 zu verwenden.2) Verwenden
fgrep
Sie diese Option, weil Sie nach einer festen Zeichenfolge suchen, nicht nach einem regulären Ausdruck.3) Entfernen Sie die
-i
Option, wenn Sie sie nicht benötigen.So wird Ihr Befehl:
Es ist auch schneller, wenn Sie Ihre Datei auf die RAM-Disk kopieren.
quelle
grep -F
mehr alsfgrep
LANG=C
(stattLC_ALL=C
) genug ist und einfacher zu tippen ist.fgrep
ist eine andere Art zu schreibengrep -F
, wieman fgrep
Sie sehen werden. Einige Versionen desman
sagen auch, dass das erstere für das letztere veraltet ist, aber die kürzere Form ist zu bequem, um zu sterben.Wenn Sie eine Multicore-CPU haben, würde ich GNU parallel wirklich empfehlen . Um eine große Datei parallel zu erfassen, verwenden Sie:
Abhängig von Ihren Festplatten und CPUs kann das Lesen größerer Blöcke schneller sein:
Es ist nicht ganz klar aus Ihrer Frage, aber andere Optionen für
grep
umfassen:-i
Flagge fallen lassen.-F
Flags für eine feste ZeichenfolgeLANG=C
-m
Flag.quelle
--pipepart
anstelle von--pipe
. Es ist viel schneller.<
Zeichen vor dem Parallelbefehl?cat file.sql | parallel ...
ein UUOC , vermeidet ihn jedoch . GNU parallel bietet auch die Möglichkeit, Eingaben aus einer Datei mit zu lesenparallel ... :::: file.sql
. HTH.Einige triviale Verbesserungen:
Entfernen Sie die Option -i, wenn Sie können. Die Groß- und Kleinschreibung wird nicht berücksichtigt.
Ersetzen Sie die
.
durch\.
Ein einzelner Punkt ist das Regex-Symbol für jedes Zeichen, das ebenfalls langsam ist
quelle
Zwei Angriffslinien:
-i
oder hast du eine Möglichkeit, es loszuwerden?grep
ist Single-Threaded, daher möchten Sie möglicherweise mehr davon an verschiedenen Offsets starten.quelle
Wenn Sie nach mehreren Zeichenfolgen suchen müssen, spart grep -f strings.txt eine Menge Zeit. Das Obige ist eine Übersetzung von etwas, das ich gerade teste. Der Optionswert -j und -n schien für meinen Anwendungsfall am besten zu funktionieren. Das -F grep machte auch einen großen Unterschied.
quelle