Re: memory leak in reportlab xmllib.FastXMLParser

Andy Robinson <[email protected]>
Newsgroups gmane.comp.python.reportlab.user
Message-ID <CABjtApsVQjMc1jgcHG=XfX+wpvRHkPnz92C+1qopxOY3pZDKdg@mail.gmail.com>
Hi Mirko (and everyone),

I suggest it's not worth too much time on this.

The last stage of our port to python 3.3 compatibility is for us to
change the ParaParser to work on something available in python 2.7 and
3.3 and get rid of sgmlop/xmllib forever. I think we will be there
within two weeks.

The problem is that we need to parse a lot of little chunks of text,
and the available C based parsers need some expensive setup (e.g. to
set up all the entities), then we loop over them in Python anyway.
After various speed experiments, I have concluded that there is no
performance benefit to messing around with expat/etree/lxml/pyRXP, so
I'm currently trying to rewrite paraparser.py using the html.parser in
Python's standard library.    This will allow us to be fairly tolerant
of poor markup, and to initialize a parser object quickly.    And we
can get rid of sgmlop/xmllib forever.    I would hope that a parser in
the standard library is leak free; if not at least it's Somebody
Else's Problem ;-)

Once we get this done, we hope to 'juggle branches' so that the
default code is running the new paraparser and work towards a release
in January or early February.

- Andy


On 17 December 2013 16:14, Mirko Dziadzka <[email protected]> wrote:
> Hi
>
> I’m not sure if this is the right list for a bug report, any pointers to another address are welcome.
>
> Problem description
> ===============
>
> The following program creates a memory leak.
>
> As a result, using reportlab.platypus.paraparser.ParaParser creates a memory leak too.
> As a result, wordaxe has a memory leak (my original problem)
>
>
> # show memory leak
> import  gc
> from reportlab.lib import  xmllib
>
> assert xmllib.sgmlop # check that we are using FastXMLParser
>
> while True:
>    parser = xmllib.XMLParser(verbose=0)
>    parser.close()
>    gc.collect()
>
>
> How to reproduce
> ==============
>
> Just start this program and watch the memory going up … see the 6th column in the ps output below
>
> $ while sleep 10 ; do ps auxww | grep python | grep -v grep ; done
> mirko            1023 100,0  0,3  2467680  25608 s000  R+    5:10pm   1:00.44 python t.py
> mirko            1023 100,0  0,3  2469728  27424 s000  R+    5:10pm   1:10.47 python t.py
> mirko            1023  99,3  0,3  2471520  29048 s000  R+    5:10pm   1:20.50 python t.py
> mirko            1023 100,0  0,4  2472288  30616 s000  R+    5:10pm   1:30.54 python t.py
>
>
> I tested this with reportlab-2.5 and reportlab-2.7 on CentOS-6-64bit and MacOS 10.8 with Python 2.7 and Python 2.6
>
> Analysis
> =======
>
> It seems that there is a cyclic reference between FastXMLParser and sgmlop and parser.close() is not cleaning up.
>
> Using the SlowXMLParser instead of XMLParser is working fine.
>
>
> _______________________________________________
> reportlab-users mailing list
> [email protected]
> http://two.pairlist.net/mailman/listinfo/reportlab-users



-- 
Andy Robinson
Managing Director
ReportLab Europe Ltd.
Thornton House, Thornton Road, Wimbledon, London SW19 4NG, UK
Tel +44-20-8405-6420
_______________________________________________
reportlab-users mailing list
[email protected]
http://two.pairlist.net/mailman/listinfo/reportlab-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.