The underlying XMLNode needs to be freed using xmlFreeNode from libxml2: http://xmlsoft.org/html/libxml-tree.html#xmlFreeNode
I don't think this is wrapped yet, but it should be straightforward to add -- ideally, called via a finalizer so that the objects are freed automatically when Julia decides they can be GC'd. On Mon, Jan 26, 2015 at 7:42 AM, Robert Feldt <[email protected]> wrote: > Hi, > > Does anyone now how to free up the memory in a XMLElement object in > LightXML.jl? > > LightXML.jl has a free(xdoc::XMLDocument) but no corresponding > free(xelem::XMLElement). There are functions related to free in clib.jl in > the package but no docs that I can find on how to use it. I tried to create > an XMLDocument from the element and then free the document but mem still > leaks. Help appreciated. > > Background/context/details: > > In another thread we found out that our problems with mem-leaks in a > long-running optimization is probably due to the use of LightXML.jl. The > latter seem to require manual free'ing of resources as of the current > version. Basically our main loop is something like this: > > # Create a large number of XMLElement's (possibly deeply nested) with > construct_element(name::String, content::Array{Any}) = begin > xmlelement = new_element(name) > for item in content > if typeof(item) <: Main.XMLElement > add_child(xmlelement, item) > elseif typeof(item) <: (String,String) > set_attribute(xmlelement, item[1], item[2]) > elseif typeof(item) <: String > add_text(xmlelement, item) > else > @assert false > end > end > xmlelement > end > > # What we are optimizing is the length of the xml when printed as string > so we evaluated this by looping over array of xml elements generated > # by construct_element above and calling on each one (the replace is for > taking away at least some of the whitespace which is not important): > fitness(xml) = length(replace(string(xml), r">\s+<", "><")) > > Since the optimization algorithm calls fitness on 100K to several million > xml elements per run when we compare several optimization algorithms to > each other the mem expansion gets up to many gigs and eventually there is > problems. It seems there is no free on XMLElement in LightXML.jl but there > is a free for XMLDocument. We thus tried to change to this: > > free_xmlelement(xmlelem::XMLElement) = begin > tempdoc = XMLDocument() > set_root(tempdoc, xmlelem) > free(tempdoc) > end > fitness_with_free(xml) = begin > qv = length(replace(string(xml), r">\s+<", "><")) > free_xmlelement(xml) > qv > end > > but it does not seem to help. We would appreciate any help/advice on this > or how we can further debug it. The documentation for xmlFreeDoc in > libxml2 (which is what is what LightXML.free(xdoc::XMLDocument) calls) > says that it will recursively free the document. But maybe we are missing > something. > > Thanks for any advice, > > Robert Feldt >
