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
>

Reply via email to