Thank you so much Charlie.
I am for sure going to switch my code to stop abusing find and instead
iterate over the children.  Good catch.

If I can find some spare time I am going to give XMLReader a go and if I can
work up the courage I will also try to patch the C code to free those
objects.

Matt Margolis

2008/8/16 Charlie Savage <[EMAIL PROTECTED]>

>
>
> Matthew Margolis wrote:
>
>> I don't mind setting nodes = nil before calling GC.start (read some other
>> threads so I think I understand why I have to do that) but I do mind the
>> speed hit, so if you think there is a way around that I would love to know
>> more.
>>
>
> It would all be in the C code.  Something like:
>
> xml_document:
>  * for each xpath_object returned, store a pointer to it (st_hash, key is a
> pointer, value is the object)
>  * Update api to include register_xpath_object, unregister_xpath_object
>  * When freed, iterate over xpath objects, and any left tell them to free
> their underlying C object (not the ruby object)
>
> xpath_object
>  * On creation, call document.register_xpath_object
>  * On freeding, call document.unregister_xpath_object
>  * Add api, called by document, called free_xpath_object (or some such)
>
>
>
>> My general calling pattern is 1.  Document#find_first to get the most top
>> level element I am interested in 2.  top_level_element#find for each of its
>> direct children.  When I find each child I then recurse down and load that
>> children's children.
>>
>
> No need to call find for that.  Just iterate over the children directly -
> will be faster.  node.children I think it is....
>
>  So yes I am walking the entire tree which will create a bunch of objects.
>>  When only grabbing the top level element in my test program I am still
>> seeing a big spike in memory.  I looked at the XPath Object code and it
>> looks to me like this case is the one I am going to match when trying to
>> find the topmost element of interest.
>>
>>  case XPATH_NODESET:
>>    rval = Data_Wrap_Struct(cXMLXPathObject,
>>                            ruby_xml_xpath_object_mark,
>>                            ruby_xml_xpath_object_free,
>>                            xpop);
>>
>> I am not familiar with Data_Wrap_Struct(part of Ruby?) so I don't know if
>> it could potentially create lots of objects.
>>
>
> Yes, this wraps just the return object.  The xpop object looks like this:
>
> http://xmlsoft.org/XSLT/object.gif
>
> Its iterating over xpop->nodesetval I was mentioning.
>
>
>> I will look at the XMLReader tests to try to get a better feel for if it
>> will meet my needs.  Thank you for the suggestion.
>>
>
> Sure - sounds like that will be your best bet.  Seems perfect for what you
> need.
>
> Charlie
>
> _______________________________________________
> libxml-devel mailing list
> libxml-devel@rubyforge.org
> http://rubyforge.org/mailman/listinfo/libxml-devel
>
_______________________________________________
libxml-devel mailing list
libxml-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/libxml-devel

Reply via email to