Re: Re: Memory Leaks In Matrix Summation
- To: mathgroup at smc.vnet.net
- Subject: [mg5863] Re: [mg5830] Re: [mg5822] Memory Leaks In Matrix Summation
- From: Tom Wickham-Jones <twj>
- Date: Sun, 2 Feb 1997 01:30:44 -0500
- Sender: owner-wri-mathgroup at wolfram.com
G. David Lange wrote: > > >In summing a matrix I write over previous values > >in a do loop. However, as the resulting sample > >shows, the memory continues to grow (as it is in a loop > >it should, of course, write over itself). Is this > >a bug, and if so is there some means of avoiding it? > > > > > >In[1]:= > >xx=Array[Random[]+I Random[],{41,206}]; > > > >In[2]:= > >(* 206 x 206 Matrix of zeros *) > >res0=Table[0,{i,1,206},{j,1,206}]; > > > >In[3]:= > >(* Generate Matrix 206 x 206 ten times & sum over loop *) > >Do[ > > > >xxk=xx[[k]]; > >Print["#: ",k]; > >res=Re[Outer[Times,Conjugate[#],#]&[xxk]]; > >res0=res0+res; > >Print["Mem: ",N[MaxMemoryUsed[]/10^6]], > > > >{k,1,10}] > > > >#: 1 > >Mem: 10.9363 > >#: 2 > >Mem: 13.3135 > >#: 3 > >Mem: 14.332 > >#: 4 > >Mem: 15.5276 > >#: 5 > >Mem: 17.7384 > >#: 6 > >Mem: 19.9492 > >#: 7 > >Mem: 22.16 > >#: 8 > >Mem: 24.3708 > >#: 9 > >Mem: 26.5816 > >#: 10 > >Mem: 28.7924 > > > Mathematica keeps an infinite memory of all "In" and "Out" regardless of the way you program your loops. To defeat this use a command like > $HistoryLength=1. > The only penalty for this is that you cannot use % to refer to "Out"s farther back than your HistoryLength. Actually the reason for the increase in memory usage each trip round the Do loop is not a consequence of the main loop history mechanism. The history mechanism would only keep the result of evaluating In[3]. The example here shows an increase in memory inside of the Do. To see what is happening here it might be better to work with smaller examples... this would quickly show that the Array command is not generating a matrix of complex numbers. Array applies its first argument to elements generated from the iterator arguments. In[13]:= Array[f, {2,2}] Out[13]= {{f[1, 1], f[1, 2]}, {f[2, 1], f[2, 2]}} so in this example xx is not a matrix of numbers but a more complicated symbolic quantity. In[14]:= Array[ Random[]+I Random[], {2,2}] Out[14]= {{(0.670193 + 0.623252 I)[1, 1], (0.670193 + 0.623252 I)[1, 2]}, > {(0.670193 + 0.623252 I)[2, 1], (0.670193 + 0.623252 I)[2, 2]}} Everything goes wrong after this, the res0 result gets bigger and bigger (as a general symbolic matrix) which is why memory usage increases. The solution is to generate the random matrix with Table. In[15]:= xx = Table[ Random[ Complex], {2},{2}] Out[15]= {{0.820949 + 0.896121 I, 0.0745521 + 0.841437 I}, > {0.52045 + 0.158571 I, 0.82055 + 0.117863 I}} Tom Wickham-Jones Wolfram Research.