[pyar] leyendo archivo en paralelo

Sebastian Bassi sebastian.bassi en globant.com
Vie Ago 8 10:52:24 ART 2014


Tengo un archivo que crece rápido (lo llamo "bigfile") y un programa
que programa que lee bigfile y hace algo con cada linea que tarda mas
tiempo que lo que tarda en generarse en ese archivo una linea nueva.
Por ese motivo, quiero correr varias veces un programa para atacar
bigfile desde varios lugares simultaneamente.
Para esto hice 3 programas:
1- Un "generador" de bigfile que crece rápido, con fines de
experimentación y para que lo puedan reproducir sin tener que tener el
archivo verdadero que requiere varios programas para generar. codigo:
http://pastebin.com/2j98y2iE
2- Un "procesador" o "worker" que es el que lee y procesa el archivo,
pero salteandose X lineas desde la linea Y (X e Y son argumentos de
linea de comandos). Por ejemplo lo puedo correr salteandose 10 lineas
y empezando por la 1ra, y luego en paralelo corro otra instancia
tambien cada 10, pero comenzando por la 2da, etc. Este programa, tira
el resultado a stdout. codigo: http://pastebin.com/gdJV7N0A
3- Un programa para disparar los workers y recolectar todos los
outputs de manera ordenada. codigo: http://pastebin.com/TWNvK9da

Esto funciona, sobre todo si el archivo que crece termina de crecer
antes que el ultimo worker llegue al final. Ahora, si los workers
llegan al final del archivo, pero este luego vuelve a crecer, los
workers no se dan cuenta y terminan, no "espera" a que haya mas
lineas.

Cualquier sugerencia de como mejorar esto será bienvenida, aca pego el
código del programa 3 que es el mas relevante:

import subprocess
import os
import pdb


workers = 10
ps = [subprocess.Popen(['python', 'processbf.py', str(workers), str(i)],
                        stdout=subprocess.PIPE, close_fds=True) for i
in range(workers)]

try:
    os.remove("out.txt")
except:
    pass

mx = 0
while workers>mx:
    for p in ps[:]:
        line = p.stdout.readline()
        if line:
            with open("out.txt", 'a') as fo:
                fo.write(line)
        else:
            mx+=1


Saludos,



-- 
Sebastián Bassi. sebastian.bassi en globant.com
Lic. en Biotecnología con orientación en genética molecular.
Software Developer @ Globant.


More information about the pyar mailing list