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