Listados con Reportlab mediante trml2pdf

Amm-Python python en ammsoft.com
Mar Feb 27 16:46:04 CET 2007


Después de revisarlo todo, veo que el problema no está en trml2pdf sino
en el propio reportlab. 

Reportlab va demasiado lento para grandes listados.

He modificado uno de los test de reportlab, para utilizar sólo el trozo
que genera una tabla y los tiempos, para muchos registros, son demasiado
altos.

Para 500 registros  2.750s (rápido)
Para 1000 registros 6.063s (bien)
Para 2000 registros 13.797s (empieza a no gustarme)
Para 3000 registros 23.641s (no me gusta)
Para 4000 registros 35.813s (sigue sin gustarme)
Para 5000 registros 50.469s (esto ...)

(Nota: No hay cabeceras ni pies de página, ni contadores de las mismas,
ni logotipos, etc.)

Para mi es normal hacer un informe con 10000, 20000, 50000 registros.
Sobretodo informes de resúmenes anuales; seguro que no sirven para nada,
pero a los clientes les encantan.

Por lo que concluyo que, o el esquema del ejemplo no es eficiente, o yo
no se hacerlo mejor, o debo utilizar otra alternativa para generar el
pdf.

Mientras sigo exportando datos a formato xls y/o csv.

Hasta me estoy planteando que el cliente instale LaTex y hacer el
listado en dicho formato. Y antes de planteármelo seriamente, pregunto,
¿con qué generáis listados de grandes volúmenes de información?.

Saludos.

P.D.
El ejemplo del test del Reportlabs modificado para evaluar el
rendimiento es el siguiente: 

El original es el test_platypus_tables.py

from reportlab.test import unittest
from reportlab.test.utils import makeSuiteForClasses, outputfile,
printLocation 

from reportlab.platypus import Spacer, SimpleDocTemplate, Table,
TableStyle 

from reportlab.lib.units import inch, cm from reportlab.lib import
colors

def old_tables_test():
    from reportlab.lib.units import inch, cm
    from reportlab.platypus.flowables import Image, PageBreak, Spacer,
XBox
    from reportlab.platypus.paragraph import Paragraph
    from reportlab.platypus.xpreformatted import XPreformatted
    from reportlab.platypus.flowables import Preformatted
    from reportlab.platypus.doctemplate import SimpleDocTemplate
    from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
    from reportlab.platypus.tables import LongTable

    styleSheet = getSampleStyleSheet()
    lst = []
    lst.append(Paragraph("Tables", styleSheet['Heading1']))
    lst.append(Paragraph("und jetzt noch eine Tabelle mit 5000 Zeilen:",
styleSheet['BodyText']))
    sty = [ ('GRID',(0,0),(-1,-1),1,colors.green),
            ('BOX',(0,0),(-1,-1),2,colors.red),]

    data = [[str(i), Paragraph("xx "* (i%10), styleSheet["BodyText"]),
Paragraph("blah "*(i%40), styleSheet["BodyText"])] for i in
xrange(5000)]# genera 5000 registros.
    t=LongTable(data, style=sty, colWidths = [50,100,200])
    lst.append(t)

    SimpleDocTemplate(outputfile('tables.pdf'),
showBoundary=1).build(lst)

class TablesTestCase(unittest.TestCase):
    "Make documents with tables"
    def test1(self):
        "Make a document full of tables"
        old_tables_test()


def makeSuite():
    return makeSuiteForClasses(TablesTestCase)


#noruntests
if __name__ == "__main__":
    unittest.TextTestRunner().run(makeSuite())
    printLocation()


> -----Mensaje original-----
> De: python-es-bounces en aditel.org [mailto:python-es-bounces en aditel.org]
> En nombre de Mario Lacunza Enviado el: diumenge, 25 / febrer / 2007 
> 00:38
> Para: La lista de python en castellano
> Asunto: Re: [Python-es] Listados con Reportlab mediante trml2pdf
> 
> 
> Hola,
> 
> El vie, 23-02-2007 a las 16:35 +0100, Amm-Python escribió:
> > Buenas a todo el mundo:
> >  
> > Primero lo básico:
> > Python 2.4.2
> > Wxpython 2.6.3
> > Reportlab 2.0
> > trml2pdf
> > Windows XP
> 
> te recomiendo tener actualizadas las versiones...
> >  
> > En la aplicación que estoy desarrollando me decidí por hacer los
> > listados de los informes mediante Reportlab usando plantillas RML, 
> > generando el listado en un PDF.
> >  
> > El resultado "Genial".
> > Hago la consulta SQL a la base de datos, proceso el
> documento rml, lo
> > paso por el trml2pdf y ya está; un lindo pdf que puedo imprimir,
> > enviar por email, etc.
> >  
> > PERO:
> > Llegó la hora de la verdad, al ponerlo en explotación y hacer un
> > listado con 6000 registros tarda una eternidad en generar
> el pdf. Por
> > las pruebas que he ido haciendo, es casi instantáneo con unos pocos
> > cientos de registros, tarda varios segundos cuando llegamos
> al millar,
> > pero a partir de ahí se ralentiza (2000 reg. x minuto aprox., 3000
> > reg. x 4 minutos!!!!)
> >  
> 
> esto me huele mal...
> 
> > Pregunto:
> > ¿Es normal que tarde tanto?. Lo que me llevaría a la
> conclusión de que
> > me he equivocado de herramienta y que no está pensada para grandes
> > documentos.
> 
> En primer lugar no es normal.
> 
> Como sacas la conclusion tan a la ligera??? te presento varias
> preguntas q DEBERIAS haber tomado en cuenta:
> 
>       * Has testeado la forma como retornas datos de la BD?? 
>       * esta tiene campos ID e Indices??
>       * como ejecutas el sql?? Select *... o Select campo1, campo2 ??
>       * ya q no pones codigo debemos pensar q sabes python, sino te
>         podria decir q tal vez tu logica sea la q podria fallar...
> 
> > ¿Puedo hacer algo para solucionarlo?
> ve lo de arriba... y manda codigo.
> 
> > ¿Qué otra forma de hacer "extensos" listados de informes utilizáis?
> Pues yo uso RL sin problemas...
> 
> --
> Mario Lacunza <mlacunza en gmail.com>
> 
> 




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