Lesen Sie mehrere Dateien mit Multiprocessing

Ich muss einige sehr große Textdateien (über 100 MB) lesen, alle Zeilen mit Regex verarbeiten und die Daten in einer Struktur speichern. Meine Struktur erbt von defaultdict und hat eine read (self) -Methode, die die Datei self.file_name liest.

Schauen Sie sich dieses sehr einfache (aber nicht reale) Beispiel an, ich verwende kein Regex, aber ich teile Linien:


import multiprocessing
from collections import defaultdict

def SingleContainer():
    return list()

class Container(defaultdict):
    """
    this class store odd line in self["odd"] and even line in self["even"].
    It is stupid, but it's only an example. In the real case the class
    has additional methods that do computation on readen data.
    """
    def __init__(self,file_name):
        if type(file_name) != str:
            raise AttributeError, "%s is not a string" % file_name
        defaultdict.__init__(self,SingleContainer)
        self.file_name = file_name
        self.readen_lines = 0
    def read(self):
        f = open(self.file_name)
        print "start reading file %s" % self.file_name
        for line in f:
            self.readen_lines += 1
            values = line.split()
            key = {0: "even", 1: "odd"}[self.readen_lines %2]
            self[key].append(values)
        print "readen %d lines from file %s" % (self.readen_lines, self.file_name)

def do(file_name):
    container = Container(file_name)
    container.read()
    return container.items()

if __name__ == "__main__":
    file_names = ["r1_200909.log", "r1_200910.log"]
    pool = multiprocessing.Pool(len(file_names))
    result = pool.map(do,file_names)
    pool.close()
    pool.join()
    print "Finish"      

Am Ende muss ich alle Ergebnisse in einem einzigen Container zusammenfassen. Es ist wichtig, dass die Reihenfolge der Zeilen erhalten bleibt. Mein Ansatz ist bei der Rückgabe von Werten zu langsam. Bessere Lösung? Ich benutze Python 2.6 unter Linux

Antworten auf die Frage(3)

Ihre Antwort auf die Frage