Lesen Sie mehrere Dateien mit multiprocessing

Muss ich Lesen, einige sehr große Textdateien (100+ Mb), verarbeiten alle Zeilen mit regex und speichern die Daten in einer Struktur. Meine Struktur erbt von defaultdict, hat es eine lese - (selbst) - Methode, das Lesen selbst.Dateiname-Datei.

Blick auf diese sehr einfache (aber nicht realen) Beispiel, ich bin nicht mit regex, aber ich bin splitting-Zeilen:


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"      

Ich am Ende müssen sich alle Ergebnisse in einem einzigen Container. Es ist wichtig, dass die Reihenfolge der Zeilen beibehalten. Mein Ansatz ist es zu langsam, wenn die Rückgabe-Werte. Bessere Lösung?
Ich bin mit python 2.6 unter Linux

Schreibe einen Kommentar