Die meisten effizienten Art und Weise, in Python Iteration über eine große Datei (10GB+)

Arbeite ich an einem Python-Skript Durchlaufen Sie zwei Dateien - die eine enthält eine Liste von UUIDs, die andere mit einer großen Menge der log-Einträge - jede Zeile mit der Uuid aus der anderen Datei. Der Zweck des Programms ist die Erstellung einer Liste der UUIDS aus Datei1, dann für jedes mal, dass die UUID gefunden wird in der log-Datei, erhöhen Sie den zugehörigen Wert für jedes mal, wenn eine übereinstimmung gefunden wird.

Also lange Geschichte kurz, zu zählen, wie oft jede UUID erscheint in der log-Datei.
Im moment habe ich eine Liste die aufgefüllt wird mit der UUID als Schlüssel und "trifft zu" als Wert. Dann eine weitere Schleife, die durchläuft jede Zeile der log-Datei, und überprüfen, ob die UUID in der log entspricht einer UUID UUID in der Liste. Wenn es passt, erhöht es den Wert.

    for i, logLine in enumerate(logHandle):         #start matching UUID entries in log file to UUID from rulebase
        if logFunc.progress(lineCount, logSize):    #check progress
            print logFunc.progress(lineCount, logSize)  #print progress in 10% intervals
        for uid in uidHits:
            if logLine.count(uid) == 1:             #for each UUID, check the current line of the log for a match in the UUID list
                uidHits[uid] += 1                   #if matched, increment the relevant value in the uidHits list
                break                                #as we've already found the match, don't process the rest
        lineCount += 1               

Es funktioniert wie es sollte - aber ich bin mir sicher, dass es eine effizientere Art und Weise der Verarbeitung der Datei. Ich habe durch ein paar guides und festgestellt, dass mit 'count' ist schneller als ein regex kompiliert. Ich dachte, Lesen von Dateien in chunks anstatt Zeile für Zeile würde die Leistung verbessern, indem die Verringerung der Menge an disk-I/O-Zeit, aber den Unterschied in der Leistung auf einem test-Datei ~200MB war vernachlässigbar. Wenn jemand noch andere Methoden wäre ich sehr dankbar 🙂

  • Datei-I/O ist in der Regel gepuffert, unabhängig von der Größe der Stücke, die Sie tatsächlich Lesen.
  • Braucht es, um noch effizienter zu werden? Wie lange dauert es? Wie lange brauchen Sie, es zu nehmen? Sie haben vielleicht schon schlagen Sie die performance-Grenze Ihres storage (disk), in dem Fall ist es egal, wie viel schneller Sie Ihre Python-Skript ist.
  • Es läuft durch eine test-Datei jetzt - es ist auf halbem Weg durch eine 10 GB-Datei, und es ist etwa 30 Minuten. Meinen ersten Python-Ausflug ich weiß wirklich nicht, ob das schnell oder langsam. Es gibt keine Voraussetzung, für die es abgeschlossen ist in x Minuten, aber schneller ist besser 😉
  • In Ihrem Beispiel ist die zweite wenn-Anweisung ist leer (kein code eingerückt, dass nach). Könnte man das lösen?
  • ist jetzt behoben, sorry!
  • Du wirst über alle UIDs für jede Zeile in der Datei. Stattdessen, finden Sie die UUID in jeder Zeile und nachschlagen in einem Wörterbuch. Versuchen so wenig wie möglich in den Teil des Codes, der wird immer genannt, am häufigsten.

InformationsquelleAutor SG84 | 2011-06-02
Schreibe einen Kommentar