Mailinglist Archive: opensuse-de (871 mails)

< Previous Next >
Re: "find -exec grep" dauert Ewigkeiten
Am 19.06.2011 15:25, schrieb Hendrik Woltersdorf:
Am Samstag, 18. Juni 2011, 23:44:54 schrieb Tao te Puh:
Am 18.06.2011 19:30, schrieb Sandy Drobic:
On 18.06.2011 16:59, Tao te Puh wrote:
Es ist die Lokalisierung !

Szenario: Ich habe mir ein Verzeichnis mit 4162 PDF-Dateien erzeugt
(~1,3GB). Darin suche ich mit grep:

time grep -i "hurz" /mnt/tmp_pdf/*

Das dauert 5m42.398s.

Dann stelle ich die Lokalisierung um auf C (das ist der Standard bei
Tiny Core Linux):

export LANG=C
export LANGUAGE=C
export LC_ALL=C

und führe genau die gleiche Suche durch:

time grep -i "hurz" /mnt/tmp_pdf/*

Das dauert lediglich 0m7.566s.

Die Suche ist also 48x schneller.

Kann mir das jemand erklären?

Hast du vor dem zweiten Versuch auch den Rechner neu gestartet?
Wenn nicht, dann hast du deine Suche aus dem Cache bedient.
Versuche es doch mal anders herum: erst auf C umstellen (NACH
Neustartt!!), messen, dann auf UTF8 noch einmal messen.

Ich habe, innerhalb einer Sitzung, mehrfach gemessen. Dabei habe ich die
Lokalisierung auch mehrfach hin- und zurückgestellt. Die Ergebnisse
differieren minimal (-> Cache spielt hier also keine Rolle), der
Unterschied zwischen den Lokalisierungen, bleibt aber immens. Auch auf
einem anderen System, dort läuft 11.2, habe ich diesen Effekt
nachvollziehen können.

Interessant ist aber vielleicht das Folgende: Auf einem Alt-System mit SuSE
9.3, ist der Unterschied zwischen unterschiedliche Lokalisierung nur
minimal, also praktisch 0.

Ansonsten kannst Du das sehr einfach und schnell selber testen:

Folgende Kommandos erzeugen ein Verzeichnis (/mnt/tmp_nullfiles) und darin
1000 Dateien mit jeweils 1MB. Dann wird mit grep getestet, die
Lokalisierung gewechselt und erneut getestet:

mkdir /mnt/tmp_nullfiles

# 1000 Dateien mit jeweils 1MB anlegen
i=1; while [ $i -le 1000 ]; do dd if=/dev/zero
of=/mnt/tmp_nullfiles/nullfile-$i bs=1M count=1; i=$(( $i + 1 )); done;

# Test mit locale=de_DE.UTF-8
time grep -i "hurz" /mnt/tmp_nullfiles/*

# Lokalisierung wechseln
export LANG=C
export LANGUAGE=C
export LC_ALL=C

# Test mit locale=C
time grep -i "hurz" /mnt/tmp_nullfiles/*

# Lokalisierung wieder zurückstellen
export LANG=de_DE.UTF-8
export LANGUAGE=de_DE.UTF-8
export LC_ALL=de_DE.UTF-8

Mach mal "strace" statt time für ein einzelnes nullfile, dann dürfte der
Unterschied klar werden. Die Variante mit einer locale <> "C" versucht, jede
Menge Dateien zu öffenen, in denen die Lokalisierungen beschrieben sind
(/usr/lib/locale/ ...).
mfg
Hendrik

hi,

soweit ich mich erinnern kann, liegt das an einem sog. UTF-Patch für die
coreutils und/oder "grep" (ist schon etwas länger her).

Eine Suche nach "grep utf performance" ergibt auch bei anderen Distris
entsprechende Meldungen.

Vor allem die Kombination von Multibyte und --ignore-case (-i) sorgt für
einen spürbaren Einbruch der Performance (alle Tests mit de_DE.UTF-8):

paolo@worker:/tmp> time grep -i "hurz" /tmp/_nullfiles/*

real 0m36.063s
user 0m35.805s
sys 0m0.248s



paolo@worker:/tmp> time grep "hurz" /tmp/_nullfiles/*

real 0m1.961s
user 0m1.715s
sys 0m0.244s


Es existieren scheinbar schon einige Patches, um das Ganze für "grep" zu
beschleunigen - vielleicht bekomme ich das mal zum Testen zusammen.

Alternativ könnte man "ack" verwenden, damit geht es auch mit
--ignore-case (-i) deutlich flotter:

paolo@worker:/tmp> time ack -i "hurz" /tmp/_nullfiles/*

real 0m4.056s
user 0m3.746s
sys 0m0.307s


Ciao,
Paolo

--
Um die Liste abzubestellen, schicken Sie eine Mail an:
opensuse-de+unsubscribe@xxxxxxxxxxxx
Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken
Sie eine Mail an: opensuse-de+help@xxxxxxxxxxxx

< Previous Next >
Follow Ups