Lee el archivo txt con multiproceso en python

Estoy tratando de leer un archivo en python (escanear líneas y buscar términos) y escribir los resultados, por ejemplo, contadores para cada término. Necesito hacer eso para una gran cantidad de archivos (más de 3000). ¿Es posible hacer eso multi hilo? Si es así, ¿cómo?

Entonces, el escenario es así:

  • Lee cada archivo y escanea sus líneas
  • Escribe contadores en el mismo archivo de salida para todos los archivos que he leído.

La segunda pregunta es, ¿mejora la velocidad de lectura / escritura?

Espero que quede lo suficientemente claro. Gracias,

Ron

Estoy de acuerdo con @aix, el multiprocessing es definitivamente el camino a seguir. Independientemente de lo que esté sujeto a I / O, solo puede leer tan rápido, sin importar cuántos procesos paralelos esté ejecutando. Pero fácilmente puede haber algo de aceleración.

Considere lo siguiente (input / es un directorio que contiene varios archivos .txt del Proyecto Gutenberg).

 import os.path from multiprocessing import Pool import sys import time def process_file(name): ''' Process one file: count number of lines and words ''' linecount=0 wordcount=0 with open(name, 'r') as inp: for line in inp: linecount+=1 wordcount+=len(line.split(' ')) return name, linecount, wordcount def process_files_parallel(arg, dirname, names): ''' Process each file in parallel via Poll.map() ''' pool=Pool() results=pool.map(process_file, [os.path.join(dirname, name) for name in names]) def process_files(arg, dirname, names): ''' Process each file in via map() ''' results=map(process_file, [os.path.join(dirname, name) for name in names]) if __name__ == '__main__': start=time.time() os.path.walk('input/', process_files, None) print "process_files()", time.time()-start start=time.time() os.path.walk('input/', process_files_parallel, None) print "process_files_parallel()", time.time()-start 

Cuando ejecuto esto en mi máquina de doble núcleo hay una aceleración notable (pero no 2x):

 $ python process_files.py process_files() 1.71218085289 process_files_parallel() 1.28905105591 

Si los archivos son lo suficientemente pequeños como para caber en la memoria, y tiene mucho procesamiento por hacer que no está enlazado a I / O, entonces debería ver una mejora aún mejor.

Sí, debería ser posible hacer esto de manera paralela.

Sin embargo, en Python es difícil lograr el paralelismo con varios subprocesos. Por esta razón, el multiprocessing es la mejor opción predeterminada para hacer cosas en paralelo.

Es difícil decir qué tipo de aceleración puede esperar lograr. Depende de qué fracción de la carga de trabajo se podrá hacer en paralelo (cuanto más, mejor), y qué fracción se tendrá que hacer en serie (cuanto menos mejor).