leer múltiples archivos usando multiprocesamiento
Necesito leer algunos archivos de texto muy grandes (100+ Mb), procesar cada línea con expresiones regulares y almacenar los datos en una estructura. Mi estructura hereda de defaultdict, tiene un método de lectura (auto) que lee el archivo self.file_name.
Mira este ejemplo muy simple (pero no real), no estoy usando expresiones regulares, pero estoy dividiendo líneas:
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"
Al final, necesito unir todos los resultados en un solo contenedor. Es importante que se mantenga el orden de las líneas. Mi acercamiento es demasiado lento al devolver valores. ¿Mejor solución? Estoy usando Python 2.6 en Linux