[pyar] leyendo archivo en paralelo

Javier Marcon javiermarcon en gmail.com
Vie Ago 8 11:10:24 ART 2014


El 08/08/14 a las 10:52, Sebastian Bassi escibió:
> 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,
Para mi lo que te conviene hacer es que el còdigo estè en un loop
infinito y cuando llega al final del archivo, cierra el archivo y lo
vuelve a abrir y sigue leyendo desde donde terminò la vez anterior.




More information about the pyar mailing list