I fixed the typo (should be finalizer and not finalize) and also had to 
import xmlFreeNode from the c lib but when I run I get:

julia(56167,0x7fff7924c300) malloc: *** error for object 0x7f9a33b159c0: 
pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

so there is something more at play here. Appreciate ideas.

Cheers,

Robert

Den måndag 26 januari 2015 kl. 17:43:04 UTC+1 skrev Robert Feldt:
>
> Actually this diff better shows the proposed changes:
>
>
> https://github.com/robertfeldt/LightXML.jl/commit/238fbb5c41629e254088dfe7553a53c72bd5dffa
>
> Will test and see if it helps.
>
> /Robert
>
> Den måndag 26 januari 2015 kl. 17:36:47 UTC+1 skrev Robert Feldt:
>>
>> Ok, great. I'm not used to explicit mem management from Julia so 
>> appreciate feedback on proposed solution:
>>
>> function free(xelem::XMLElement)
>>   ccall(xmlFreeNode, Void, (Ptr{Void},), xelem.node.ptr)
>>   xelem.node.ptr = nullptr
>> end
>>
>> since XMLElement type has a node::XMLNode attribute and the XMLNode type 
>> has a ptr::Xptr and free for XMLDocument uses xmlFreeDoc like so:
>>
>> function free(xdoc::XMLDocument)
>>     ccall(xmlFreeDoc, Void, (Ptr{Void},), xdoc.ptr)
>>     xdoc.ptr = nullptr
>> end
>>
>> and then add free as finalizer in constructor for XMLElement like so:
>>
>> function XMLElement(node::XMLNode)
>>   if !is_elementnode(node)
>>     throw(ArgumentError("The input node is not an element."))
>>   end
>>   xelem = new(node)
>>   finalize(xelem, free)
>> xelem
>> end
>>
>> I will try this and see if it addresses my problems but would be great 
>> with input on this.
>>
>> Cheers,
>>
>> Robert
>>
>> Den måndag 26 januari 2015 kl. 15:49:14 UTC+1 skrev Isaiah:
>>>
>>> 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 <robert...@gmail.com> 
>>> 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