J'ai besoin de lire de très gros fichiers texte (100+ Mb), traiter chaque ligne avec regex et stocker les données dans une structure. Ma structure hérite de defaultdict, elle a une méthode read (self) qui lit le fichier self.file_name.lire plusieurs fichiers en utilisant le multi-traitement
Regardez cet exemple très simple (mais pas réel), je ne suis pas en utilisant regex, mais je suis lignes: séparation
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"
A la fin, je dois rejoindre tous les résultats dans un seul conteneur . Il est important que l'ordre des lignes soit préservé. Mon approche est trop lente lors du retour des valeurs. Meilleure solution? J'utilise python 2.6 sous Linux
mon problème est limité par le processeur et non lié à l'E/S. Dans cet exemple, je divise des lignes, mais dans le cas réel je travaille avec une regex complexe et longue et le temps IO (recherche, ...) est beaucoup moins que le temps cpu –