#11521: Memleak when resolving the action of Integers on an Elliptic Curve
------------------------+---------------------------------------------------
   Reporter:  jpflori   |          Owner:  robertwb   
       Type:  defect    |         Status:  needs_work 
   Priority:  major     |      Milestone:  sage-4.8   
  Component:  coercion  |       Keywords:  sd35       
Work_issues:            |       Upstream:  N/A        
   Reviewer:            |         Author:  Simon King 
     Merged:            |   Dependencies:  #11900 #715
------------------------+---------------------------------------------------

Comment(by jpflori):

 I guess you're solution should be the right one because resetting the
 coercion cache solves the problem, so dealing with it should be enough for
 the example in the ticket description.

 Only one copy gets cached in _action_hash because the curves are equal
 (==) but not identical (is). However, if one uses (really) different
 curves, one of each gets also cached in _action_hash

 Here isĀ  small piece of code to test the effect of clearing different
 caches (the code to clear the ZZ cache is left as an exercise, anyway we
 should use weakrefs there):

 {{{
 sage: import gc, inspect
 sage: load /usr/share/shared/objgraph.py # or whatever you should type to
 use objgraph
 sage: from sage.schemes.elliptic_curves.ell_finite_field import
 EllipticCurve_finite_field
 sage: K = GF(1<<60, 't')
 sage: j = K.random_element()
 sage: for i in xrange(100):
 ....:     E = EllipticCurve(j=j); P = E.random_point(); 2*P; del P; del E;
 ....:
 sage: gc.collect()
 68
 sage: L = [x for x in gc.get_objects() if isintance(x,
 EllipticCurve_finite_field)]
 sage: len(L)
 100
 sage: del L
 sage: get_coercion_model().reset_cache()
 sage: gc.collect()
 6172
 sage: L = [x for x in gc.get_objects() if isintance(x,
 EllipticCurve_finite_field)]
 sage: len(L)
 1
 sage: del L
 sage: ZZ.del_hash()
 sage: gc.collect()
 56
 sage: L = [x for x in gc.get_objects() if isintance(x,
 EllipticCurve_finite_field)]
 sage: len(L)
 0
 sage: del L
 sage: for i in xrange(100):
 ....:     E = EllipticCurve(j=K.random_element()); P = E.random_point();
 2*P; del P; del E;
 ....:
 sage: gc.collect()
 174
 sage: L = [x for x in gc.get_objects() if isintance(x,
 EllipticCurve_finite_field)]
 sage: len(L)
 100
 sage: del L
 sage: get_coercion_model().reset_cache()
 sage: gc.collect()
 738
 sage: L = [x for x in gc.get_objects() if isintance(x,
 EllipticCurve_finite_field)]
 sage: len(L) # _action_hash
 100
 sage: del L
 sage: ZZ.del_hash()
 sage: gc.collect()
 5742
 sage: L = [x for x in gc.get_objects() if isintance(x,
 EllipticCurve_finite_field)]
 sage: len(L) # mmm got one left!!! not sure where it comes from yet...
 1
 }}}

-- 
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/11521#comment:81>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, 
and MATLAB

-- 
You received this message because you are subscribed to the Google Groups 
"sage-trac" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sage-trac?hl=en.

Reply via email to