Python calcula las líneas por segundo/minuto que se escriben en un archivo

Estoy interesado en crear un script de python que pueda darme estadísticas sobre cuántas líneas por intervalo (tal vez minuto) se escriben en un archivo. Tengo archivos que se escriben a medida que ingresan los datos, una nueva línea para cada usuario que pasa los datos a través del programa externo. Saber cuántas líneas por x me da una métrica que puedo usar para la planificación de futuras expansiones. Los archivos de salida consisten en líneas, todas relativamente de la misma longitud y todas con retornos de línea al final. Estaba pensando en escribir un script que hiciera algo como: medir la longitud del archivo en un punto específico y luego medirlo nuevamente en otro punto en el futuro, restar los dos y obtener mi resultado... sin embargo, no sé si esto es ideal ya que lleva tiempo medir la longitud del archivo y eso puede sesgar mis resultados. ¿Alguien tiene alguna otra idea?

basado en lo que dice la gente, armé esto para comenzar:

import os
import subprocess
import time
from daemon import runner
#import daemon

inputfilename="/home/data/testdata.txt"

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/count.pid'
        self.pidfile_timeout = 5
    def run(self):
        while True:
            count = 0

            FILEIN = open(inputfilename, 'rb')
            while 1:
              buffer = FILEIN.read(8192*1024)
              if not buffer: break
              count += buffer.count('\n')
            FILEIN.close(  )
            print count
            # set the sleep time for repeated action here:
            time.sleep(60)

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

Hace el trabajo de obtener el conteo cada 60 segundos e imprimirlo en la pantalla, supongo que mi siguiente paso es la matemática.

Una edición más: he agregado la salida del conteo en intervalos de un minuto:

import os
import subprocess
import time
from daemon import runner
#import daemon

inputfilename="/home/data/testdata.txt"


class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/twitter_counter.pid'
        self.pidfile_timeout = 5
    def run(self):
        counter1 = 0
        while True:
            count = 0

            FILEIN = open(inputfilename, 'rb')
            while 1:
              buffer = FILEIN.read(8192*1024)
              if not buffer: break
              count += buffer.count('\n')
            FILEIN.close(  )

            print count - counter1

            counter1 = count
            # set the sleep time for repeated action here:
            time.sleep(60)

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

preguntado el 17 de mayo de 12 a las 20:05

¿Son las líneas del mismo tamaño o muy similares? Mientras que contar las líneas en un archivo muy grande toma mucho tiempo, encontrar el tamaño de un archivo es mucho más rápido. -

¿Puedes editar el programa que está escribiendo los datos? Puedes modificarlo para que reporte periódicamente cuantas líneas ha escrito. -

Las líneas son algo similares, como nombre, dirección, etc... sin embargo, las respuestas a algunas preguntas de la encuesta son más largas si la persona escribe más... sin embargo, estoy de acuerdo en que encontrar un tamaño de línea promedio y un tamaño de archivo y alguna desviación podría ser el camino por recorrer ... No tengo la capacidad de modificar el programa de entrada, aunque puedo hablar con la persona que lo escribió y preguntarle si puedo. -

Cualquiera que sea la solución con la que termine, sugiero sincronizar con un software especializado (por ejemplo, wc). -

1 Respuestas

Para comentar sobre su idea (que me parece bastante sólida), ¿qué tan precisa necesita que sea la medición?

Sugiero medir el tiempo de medición primero. Luego, dada la precisión relativa que desea lograr, puede calcular el intervalo de tiempo entre mediciones consecutivas, por ejemplo, si la medición toma t milisegundos y quiere una precisión del 1%, no mida más de una vez en 100t ms.

Aunque, el tiempo de medición aumentará a medida que crezca el archivo, deberá tenerlo en cuenta.

Sugerencia sobre cómo contar las líneas en un archivo: ¿Hay un análogo de Python incorporado a Unix 'wc' para rastrear un archivo?

Sugerencia sobre cómo medir el tiempo: time módulo.

PD: acabo de intentar cronometrar el contador de línea en un archivo de 245M. La primera vez tardó unos 10 segundos (no lo cronometré en la primera ejecución), pero luego siempre estuvo por debajo de 1 s. Tal vez se haga algo de almacenamiento en caché allí, no estoy seguro.

contestado el 23 de mayo de 17 a las 13:05

@ Lev Levitky: según su comentario, edité mi publicación anterior con el comienzo de un guión: segundo

Levity: He publicado mi solución arriba - segundo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.