[linux] Re: awk en performance

Cecil Westerhof CecilWesterhof op xs4all.nl
Vr Mrt 14 15:11:19 CET 2008


Oorspronkelijk werkte ik met het lopende bestand. Normaal gesproken werk
je natuurlijk met het afgesloten dagbestand.
Hierbij geld het volgende:
      * zcat duurt 12 seconden
      * zcat naar temp bestand duurt 23 seconden
      * cat duurt 17 seconden
      * nieuwe versie duurt 26 minuten
      * oude versie duurt 40½ minuut

Hieruit blijkt i.i.g. wel dat IO weinig invloed heeft op de tijdsduur
van het script. Dus dat het nieuwe script niet langer duurt is niet
verwonderlijk. Maar dat het sneller is blijft me verbazen, want het
heeft een minuut meer werk aan IO.
Met bijna 2 miljoen records heeft de nieuwe versie 26 minuten nodig en
de oude versie 40½ minuut.

Ik heb de scripts in stappen laten werken met invoer bestanden van
10.000 tot bijna twee miljoen. Continue is de oude versie ongeveer 1½
keer zo lang bezig als de nieuwe versie. De tijdsduur van beide scripts
is lineair met de grote van het invoer bestand. (Als het invoer bestand
twee keer zo groot is, is de verwerkingstijd -ongeveer- twee keer zo
lang.)

Op een zeker moment ben ik naar de reguliere expressies gaan kijken. In
de oude versie wordt iedere keer een andere dynamische reguliere
expressie gegenereerd als de keer ervoor, terwijl in de nieuwe versie
per run maar één dynamische versie wordt gegenereerd. Dat is dus het
probleem. Als ik in de nieuwe versie in de loop een dummy reguliere
expressie genereer, dan duurt de verwerking 32 minuten. Genereer ik twee
verschillende dummy reguliere expressies (dat lijkt het het meest op de
oude versie) dan heeft de nieuwe versie ook 40½ minuut nodig. (Eigenlijk
zou je verwachten dat hij dan een minuut langer nodig zou hebben. Maar
dat is eeen erg klein verschil, dus waarschijnlijk niet significant.)
Voor zover ik kan nagaan kun je dynamische reguliere expressie in awk
niet opslaan, dus de beste oplossing is waarschijnlijk om dan maar met
drie runs te werken. Als iemand weet hoe je wel reguliere expressies
kunt opslaan, dan houd ik me aanbevolen.

Ik ben het nu aan het overzetten naar python. Mijn eerste inschatting is
dat de performance verbetering tegen gaat vallen. Ik ben nog niet klaar
en de run duurt al 20 minuten. Dus dat gaat alleen maar langer worden.

Zo'n beroerde tool is awk dan toch niet. Als reguliere expressies zouden
kunnen worden opgeslagen, dan zou awk niet significant trager zijn dan
python.

-- 
Cecil Westerhof <CecilWesterhof op xs4all.nl>




More information about the Linux mailing list