2011-10-15 24 views
16

Estoy tratando de leer un archivo en python (escanear líneas y buscar términos) y escribir los resultados, digamos, contadores para cada término. Necesito hacer eso para una gran cantidad de archivos (más de 3000). ¿Es posible hacer eso con múltiples hilos? Si es así, ¿cómo?Leer el archivo txt con multi-threaded en python

Por lo tanto, el escenario es como esto:

  • Leer cada archivo y escanear sus líneas
  • contadores de escritura al mismo archivo de salida para todos los archivos que he leído.

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

Espero que sea lo suficientemente claro. Gracias,

Ron.

Respuesta

14

Estoy de acuerdo con @aix, multiprocessing es definitivamente el camino a seguir. Independientemente de que estés atado/a - solo puedes leer tan rápido, no importa cuántos procesos paralelos estés ejecutando. Pero puede haber fácilmente alguna aceleración.

Considere lo siguiente (entrada/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 no es un (pero no 2x) aceleración notable:

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

Si los archivos son lo suficientemente pequeño como para caber en la memoria, y usted tiene un montón de procesamiento que debe realizarse y que no está vinculado a E/S, entonces debería ver mejoras aún mejores.

+0

si tiene muchos archivos, creo que creará demasiados procesos. Obtuve este process.process_files() 16.5930001736 process_files_parallel() 100.887000084 – yossi

2

Sí, debería ser posible hacerlo de forma paralela.

Sin embargo, en Python es difícil lograr el paralelismo con múltiples hilos. Por esta razón, 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 será posible realizar en paralelo (cuanto más mejor), y qué fracción se tendrá que hacer en serie (cuanto menos, mejor).

+0

"Sin embargo, en Python es difícil lograr el paralelismo con múltiples hilos", ¿puede hacer referencia al motivo de esto? excelente respuesta +1 – Tagar

Cuestiones relacionadas