Re: Memory leak or flawed garbage collector
- To: mathgroup at smc.vnet.net
- Subject: [mg120648] Re: Memory leak or flawed garbage collector
- From: "Alexey Popkov" <lehin.p at gmail.com>
- Date: Tue, 2 Aug 2011 07:11:43 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <j0u7mo$fc1$1@smc.vnet.net> <j10l01$os6$1@smc.vnet.net> <j15738$b4a$1@smc.vnet.net>
"Oleksandr Rasputinov" <oleksandr_rasputinov at hmamail.com> wrote: news:j15738$b4a$1 at smc.vnet.net... > From this we may surmise that values are not being cleared for symbols > appearing in a Module that have gone out of scope if the delayed flag is > set and if they have also been conditionally evaluated. It appears that > these values are what is preventing garbage collection; therefore I would > consider this as a bug in Module (in that it does not recognise when > values have gone out of scope in all cases) rather than in the garbage > collector itself. Consider the following simple experiment without Module: In[1]:= $HistoryLength=0; a[b_]:=(SetAttributes[d,Temporary];d:=9;d/;b===1); In[3]:= a[1] Out[3]= 9 In[4]:= Definition[d] Out[4]= Attributes[d]={Temporary} d:=9 As you see, the same bug appears without Module. So I think this is a bug in the garbage collector itself. As for Module, I feel that this function is essentially top-level, as opposed to Block. Probably it is possible to write full analog of Module in top-level Mathematica code. > Block > also does not need to create and maintain temporary symbols, and therefore > offers better performance than Module; it seems that this kind of lexical > scoping is merely emulated in Mathematica, with dynamic scoping fitting > more naturally with the language semantics. For these reasons, unless I > explicitly require the temporary symbols, I generally prefer Block in most > simple cases, or With where lexical scoping is called for. Interesting. I agree that Module looks a bit hacky from the point of view of the overall design of the system. As Richard Fateman wrote in his 1991 year paper "A review of Mathematica", Module was introduced in version 2 for fixing inconsistent design of Block scoping and scoping in replacement rules: defining g[x_] := Block[{a}, a = 1 + x] and then evaluating g[a] gives $RecursionLimit::"reclim" error instead of 1+a. Module solves this problem.
- Follow-Ups:
- Re: Memory leak or flawed garbage collector
- From: Daniel Lichtblau <danl@wolfram.com>
- Re: Memory leak or flawed garbage collector