Seite 1 von 1

grosse Datei einlesen und weiterverarbeiten dauert lange

Verfasst: Montag 2. Mai 2011, 20:36
von marlob
Hallo,

ich habe eine 25 MB grosse Textdatei die ich nach bestimmten Funktionsaufrufen durchsuchen möchte. Die Ergebnisse schreibe ich dann mit xlwt in eine Exceldatei.
Dazu habe ich ein Beispiel von xlwt angepasst.
Den Code habe ich hier online gesetzt
http://pastebin.com/nXZwXYJa

Jetzt dauert die Ausführung des Skriptes ca 460 Sekunden. Meine Frage ist nun ob ich am Code was optimieren kann, damit er schneller ausgeführt wird?
Hier das Ergebnis vom Aufruf mit cProfile
http://pastebin.com/5Ld2FuDF

Re: grosse Datei einlesen und weiterverarbeiten dauert lange

Verfasst: Montag 2. Mai 2011, 20:49
von marlob
Hier noch ein Link zu der Textdatei die ich einlesen möchte
http://dl.dropbox.com/u/7063475/m7110426_baitt.zip

Re: grosse Datei einlesen und weiterverarbeiten dauert lange

Verfasst: Montag 2. Mai 2011, 21:50
von BlackJack
@marlob: Am meisten Zeit frisst anscheinend der Parser. Die Funktion läuft 459 Sekunden. Die `parse()`-Funktion nimmt davon 454 Sekunden in Anspruch. Das Schreiben in das Arbeitsblatt insgesamt nur eine Zehntelsekunde:

Code: Alles auswählen

        1    3.514    3.514  459.841  459.841 write_xls.py:11(write_xls)
   591185    1.405    0.000  454.486    0.001 config.py:853(parse)
     3900    0.004    0.000    0.100    0.000 Worksheet.py:1002(write)
Vielleicht solltest Du mal einen anderen Parser ausprobieren. Oder vielleicht reicht es ja auch schon mit ganz einfachen Mitteln zumindest mal zu prüfen ob die Zeile mit Leerzeichen und 'call' beginnt, bevor Du sie parst. Denn die überwiegende Mehrzahl der Zeilen scheint ja nicht auf das Muster zu passen.

Re: grosse Datei einlesen und weiterverarbeiten dauert lange

Verfasst: Montag 2. Mai 2011, 22:14
von BlackJack
@marlob: Dein Programm lief bei mir fast 13 Minuten. Nachdem ich `lepl` durch `pyparsing` ersetzt habe, lief es in 13 Sekunden durch. Und die Änderungen dafür sind nicht so besonders gross gewesen:

Code: Alles auswählen

import pyparsing as pp
# ...
    number = pp.Regex(
        r'[\+\-]?(?:[0-9]*\.[0-9]+|[0-9]+\.|[0-9]+)(?:[eE][\+\-]?[0-9]+)?'
    )
    calls = pp.Suppress('call')
    string = pp.QuotedString('"', '\\')
    fctmmi = (
        calls + pp.Regex(r'\w+') + pp.Suppress('(') + string
        + pp.Suppress(',') + string + pp.Suppress(',') + number
        + pp.Suppress(')')
    )
# ...
                try:
                    result = fctmmi.parseString(decline)
                    # print result
                    rowx += 1
                    for colx, value in enumerate(result):
                        sheet.write(rowx, colx, value, data_xfs[colx])
                except pp.ParseException:
                    pass
Den regulären Ausdruck für Zahlen habe ich aus `lepl` kopiert.

Re: grosse Datei einlesen und weiterverarbeiten dauert lange

Verfasst: Dienstag 3. Mai 2011, 11:41
von marlob
@BlackJack
Ich habe deinen Vorschlag mal umgesetzt und der Unterschied ist schon bemerkenswert.
Vielen Dank für den Hinweis :D