#11521: Use weak references to cache homsets
--------------------------------------------------+-------------------------
Reporter: jpflori | Owner: robertwb
Type: defect | Status:
needs_review
Priority: major | Milestone: sage-5.3
Component: coercion | Resolution:
Keywords: sd35 | Work issues:
Report Upstream: N/A | Reviewers: Jean-Pierre
Flori
Authors: Simon King | Merged in:
Dependencies: #12969; to be merged with #715 | Stopgaps:
--------------------------------------------------+-------------------------
Changes (by SimonKing):
* status: needs_work => needs_review
Old description:
> Originally, this ticket was about the following memory leak when
> computing with elliptic curves:
>
> {{{
> sage: K = GF(1<<55,'t')
> sage: a = K.random_element()
> sage: while 1:
> ....: E = EllipticCurve(j=a); P = E.random_point(); 2*P;
> }}}
> This example is in fact solved by #715. However, while working on that
> ticket, another leak has been found, namely
>
> {{{
> sage: for p in prime_range(10^5):
> ....: K = GF(p)
> ....: a = K(0)
> ....:
> sage: import gc
> sage: gc.collect()
> 0
> }}}
> So, I suggest to start with #715 and solve the second memory leak on top
> of it. It seems that a strong cache for homsets is to blame. I suggest to
> use the weak `TripleDict` instead, which were introduced in #715.
>
> '''To be merged with #715'''. Apply
>
> * the patches from #715
> * [attachment:trac_11521_homset_weakcache_combined.patch]
New description:
Originally, this ticket was about the following memory leak when computing
with elliptic curves:
{{{
sage: K = GF(1<<55,'t')
sage: a = K.random_element()
sage: while 1:
....: E = EllipticCurve(j=a); P = E.random_point(); 2*P;
}}}
This example is in fact solved by #715. However, while working on that
ticket, another leak has been found, namely
{{{
sage: for p in prime_range(10^5):
....: K = GF(p)
....: a = K(0)
....:
sage: import gc
sage: gc.collect()
0
}}}
So, I suggest to start with #715 and solve the second memory leak on top
of it. It seems that a strong cache for homsets is to blame. I suggest to
use the weak `TripleDict` instead, which were introduced in #715.
'''To be merged with #715'''. Apply
* the patches from #715
* [attachment:trac_11521_homset_weakcache_combined.patch]
* [attachment:trac_11521_callback.patch]
--
Comment:
OK, the additional patch has been posted. It removes the explicit weak
reference to the category (`TripleDict` uses a weak reference anyway),
adds a callback to the weak reference to the homset, so that an item of
the homset cache gets deleted if the homset is garbage collected, and it
replaces "if H:" by "if H is not None:".
I doctested sage/schemes/ (heuristics: If there is a problem with one of
my patches, then a segfault occurs in sage/schemes :), sage/structure/ and
sage/categories/homset.py (hence, the memory leak remains fixed).
Apply #715 trac_11521_homset_weakcache_combined.patch
trac_11521_callback.patch
--
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/11521#comment:149>
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.