Forums Neueste Beiträge
 

Multi-Threaded Grep?

26/10/2011 - 15:21 von Alexander Skwar | Report spam
Hallo.

Ich stehe immer mal wieder vor der Aufgabe, das ich *EINE*
*GROSSE* Datei durchsuchen / greppen muss. Z.B. eine
Apache error_log von 15 GB.

Das zu greppen ist natürlich mit einem gewissen Zeitaufwand
verbunden.

Wenn ich nun nicht eine riesige Datei hàtte, sondern z.B.
30 500 MB Dateien (bzw. eben "viele" Dateien), dann könnte
man ja mit Hilfe von xargs schneller greppen:

$ date ; time ( find ./ -name "error_log.0.5*" | xargs -n1 -P8 grep
'FastCGI: incomplete headers (0 bytes) received' >> grep.xargsP8 ) ;
date
Wed Oct 26 15:12:08 CEST 2011
( find ./ -name "error_log.0.5*" | xargs -n1 -P8 grep >>
grep.xargsP8; ) 6.86s user 54.48s system 885% cpu 6.930 total
Wed Oct 26 15:12:15 CEST 2011

$ date ; time grep 'FastCGI: incomplete headers (0 bytes) received'
error_log.0 >> grep.direkt; date
Wed Oct 26 15:12:35 CEST 2011
grep 'FastCGI: incomplete headers (0 bytes) received' error_log.0 >>
4.63s user 27.54s system 24% cpu 2:12.47 total
Wed Oct 26 15:14:47 CEST 2011

$ wc -l error_log.0 ; du -h error_log.0
64270071 error_log.0
13G error_log.0

$ du -sch error_log.0.50000l-aaaaa*
10M error_log.0.50000l-aaaaaaaa
[…]
10M error_log.0.50000l-aaaaabxk
4.1M error_log.0.50000l-aaaaabxl
13G total

$ time wc -l error_log.0.*
50000 error_log.0.50000l-aaaaaaaa
50000 error_log.0.50000l-aaaaaaab
[…]




Der direkte grep hat 129 Sekunden gedauert,
wohingegen der xargs -P8 grep (also 8
greps gleichezeitig) nur 7 Sekunden dauerte.

Kennt jemand eine multi threaded grep
Implementation? Weil, immer zuerst die
Datei in viele Blöcke zu splitten ist beliebig
mühselig...

Gruss und Dank,
Alexander
 

Lesen sie die antworten

#1 Ralf Döblitz
26/10/2011 - 19:51 | Warnen spam
Alexander Skwar schrieb:
Hallo.

Ich stehe immer mal wieder vor der Aufgabe, das ich *EINE*
*GROSSE* Datei durchsuchen / greppen muss. Z.B. eine
Apache error_log von 15 GB.

Das zu greppen ist natürlich mit einem gewissen Zeitaufwand
verbunden.

Wenn ich nun nicht eine riesige Datei hàtte, sondern z.B.
30 500 MB Dateien (bzw. eben "viele" Dateien), dann könnte
man ja mit Hilfe von xargs schneller greppen:


[...]
Kennt jemand eine multi threaded grep
Implementation? Weil, immer zuerst die
Datei in viele Blöcke zu splitten ist beliebig
mühselig...



Bist du sicher, daß bei deinem Test nicht die kleinen Dateien durch die
vorherige Zerlegung bevorteilt wurden (d.h. sich im Cache befanden)? Ich
würde bei derartige großen Files eigentlich primàr I/O-Last erwarten und
die CPU-Auslastung für vernachlàssigbar ansehen (außer bei sehr komple-
xen Regexen).

Ralf
Wenn Du so minderbemittelt bist, daß Du es nötig hast, die Worte anderer
für Dich sprechen zu lassen, dann kann ich Dir meine Hilfe schlecht
versagen...
  – Thorsten Albers in

Ähnliche fragen