Si vous avez une machine à multi-cœurs, et peut utiliser Python 3.2 (au lieu de Python 2), ce serait un bon cas d'utilisation pour la concurrent.futures
nouvelle fonctionnalité en Python 3.2 - en fonction du traitement que vous devez faire à chaque ligne. Si vous avez besoin que le traitement soit effectué dans l'ordre des fichiers, vous devrez probablement vous soucier de réassembler la sortie plus tard. Sinon, l'utilisation de concurrencer.futures peut programmer chaque client pour être traité dans une tâche différente avec peu d'effort. Quel est le résultat que vous devez générer à ce sujet?
Si vous pensez que vous ne pourriez pas profiter de la parallélisation du contenu de chaque ligne, la façon la plus évidente est la meilleure façon de faire: c'est ce que vous venez de faire.
Cet exemple divise le traitement en 12 sous-processus, chacun exécutant la fonction len
intégrée de Python. Remplacer len
pour une fonction qui reçoit la ligne en tant que paramètre et exécute tout ce que vous devez traiter sur cette ligne:
from concurrent.futures import ProcessPoolExecutor as Executor
with Executor(max_workers=5) as ex:
with open("poeem_5.txt") as fl:
results = list(ex.map(len, fl))
L'appel « liste » est nécessaire pour forcer la cartographie à faire dans le « par » déclaration . Si vous n'avez pas besoin d'une valeur scalaire pour chaque ligne, mais plutôt d'enregistrer un résultat dans un fichier que vous pouvez le faire dans une boucle à la place:
for line in fl:
ex.submit(my_function, line)
Vous avez un seul fichier 100 Go ??? –
C'est à peu près le meilleur moyen. –
Incroyable. De toute évidence quelque chose ne va pas dans votre application si elle génère 100GB File :-) –