Mejora de rendimiento

Tomás Javier Robles Prado tjavier en usuarios.retecal.es
Jue Sep 18 19:08:14 CEST 2003


Hola,

	Estoy escribiendo un programilla que ordene por fecha las líneas de un
fichero de log de Zope (que es básicamente igual que los de apache).

	Las funciones más relevantes del programa son:


from sys import argv
from time import strptime, mktime

DATE_FORMAT = "%d/%b/%Y:%H:%M:%S +0200"

def cmp (l1, l2):
    """Compara dos líneas de log de tipo apache según su fecha"""
    if mktime(strptime(l1.split('[')[1].split(']')[0] , DATE_FORMAT)) > 
mktime(strptime(l2.split('[')[1].split(']')[0] , DATE_FORMAT)) :
        return 1
    elif   mktime(strptime(l1.split('[')[1].split(']')[0] ,
DATE_FORMAT)) ==  mktime(strptime(l2.split('[')[1].split(']')[0] ,
DATE_FORMAT)) :
        return 0
    else :
        return -1

def run (log, output):
    try:
        f = file (log, 'r')
    except IOError:
        print "No se ha podido abrir ", log
        return

    lineas = []


    print ("Leyendo de %s..." % log)
    #Se lee el fichero
    l = f.readline()
    while l != "":

        #Hay que intentar descartar líneas de este tipo:
        #127.0.0.1 34922 ==> 226 Transfer complete.
        #o este:
        #/usr/lib/zope/z2.py:385: UserWarning: You are running... 
        try:
            if l.split()[1][0] == '-':
                #Esto se cumple si es un hit habitual  
                lineas.append(l)

        except IndexError:
            pass

        l = f.readline()

    f.close()    

    print ("Ordenando %d lineas..." % len(lineas))

    #Se ordena la lista
    lineas.sort(cmp)

    print ("Guardando en %s..." % output)
    try:
        f = file(output, 'w')
    except IOError:
        print "No se ha podido abrir ", output
        return       

    f.writelines(lineas)
    f.close()

    return


El tiempo de ejecución con un fichero de unos 40 MB (157431 líneas) es
desastroso. ¿A alguien se le ocurre alguna optimización útil? Tampoco me
merece la pena usar psyco ni otros artificios extraños, ya que
programaré el script para ejecutarse a las 4 d la mañana con prioridades
bajas. Por cierto, ¿que algoritmo utiliza sort para ordenar?

-- 
Un saludo,
Tomás Javier Robles Prado
http://milugar.doesntexist.org

------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es