Please guys.. Answer this thread, this is a bad problem. It is important to do something about it... :-/
Nathann On Sunday, April 6, 2014 7:21:18 PM UTC+2, Nils Bruin wrote: > > The following paradigm happens for > "sage.combinat.posets.posets.FinitePoset" and their "linear_extensions", > but it's such an easy mistake to make that I'd almost consider it a flaw in > our design: > > class A(Parent,UniqueRepresentation): > .... > @cached_method > def BfromA(self): > return B(A) > > class B(Parent,UniqueRepresentation): > ... > > If one does > > a = A(....) > b = a.BfromA() > del a,b > > one leaks memory. This is because the (global!) UniqueRepresentation cache > for B will have a strong reference to a (as a key in a WeakValueDictionary) > , since it's a construction parameter for b, and a will be holding a strong > reference to b because BfromA was declared a cached method. Hence, a keeps > b alive, and as long as b is alive, a will be kept alive due to the strong > reference in the weakvaluedict. > > The solution here probably is to NOT cache BfromA, since the lookup > performed by B(A) will be very fast anyway (if the thing already exists), > but you can see how difficult it now becomes to decide whether you can > safely stick a @cached_method decorator somewhere: If the result contains a > UniqueRepresentation object that is constructed using something linked to > the object on which the cached_method lives, you probably can't. But this > becomes a highly non-local thing to decide, because now you need to know > the implementation details of lots of things you might be using. > > The real problem here is UniqueRepresentation. Fundamentally, that breaks > locality. We try to hide the problems a little bit by using a WeakValueDict > to cache things, but as this example shows, it only takes one extra level > to let the problems resurface. Any ideas on how we can mitigate these > problems? Educating developers perhaps? > -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at http://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.