9

Example: Try this example only if you have > 4G ram

d = 2000; 
f[x_, y_, d_] = 
     Sum[Subscript[a, i, j]*x^i*y^j, 
       {i, 0, d - 1}, {j, 0, d - i}];

Then

Clear[f]

or

f[x_, y_, d_] =.

You will see that the memory usage is not reduced after calling Clear or using Unset.

Question: How to free the memory when I don't need a function anymore which is already evaluated?

Edit: I look at the memory usage in taskmgr under Windows OS. As the answers report that the memory is indeed reduce by using MemoryInUse to check it.

user565739
  • 1,119
  • 1
  • 9
  • 14
  • 4
    Try setting $HistoryLength=0. Then you'll not use additional memory for saving results of old computations (anything like %1 won't work in this case). – Ruslan Aug 17 '13 at 17:16
  • @Ruslan, But I need to save the results for some later use, only to a certain point I don't need some old results anymore. – user565739 Aug 17 '13 at 17:20
  • User, I don't understand; do you want to save the results to a file? – Mr.Wizard Aug 17 '13 at 17:22
  • Not saving to a file. I need to use the result of f later at some point in the computation, and after that point, I don't need it anymore. – user565739 Aug 17 '13 at 17:26
  • 3
    If you define f with $HistoryLength=0, it'll still remain defined until you Clear it. You just won't be able to access output of any previous computed cells via %n, and "Show More" etc. buttons won't work. – Ruslan Aug 17 '13 at 17:28
  • @Ruslan, thanks. But a neat question still: Can one define f with $HistoryLength=0? It seems to me $HistoryLength is defined in the scope of a notebook or larger? What I mean is that can one change $HistoryLength several times in a notebook? – user565739 Aug 17 '13 at 17:35
  • $HistoryLength only is about history, not variables you define. So, you can have any value for $HistoryLength, and you can still work with your variables as usual — only not have access to history of outputs. And yes, if you need, you can change $HistoryLength at any time. – Ruslan Aug 17 '13 at 17:39

1 Answers1

5

In version 7 I cannot confirm what you report. With my default of $HistoryLength = 3 I see:

d = 2000;
f[x_, y_, d_] = Sum[Subscript[a, i, j]*x^i*y^j, {i, 0, d - 1}, {j, 0, d - i}];

MemoryInUse[]

Clear[f]
MemoryInUse[]

774871544

454831808

With $HistoryLength = 0 as suggested by Ruslan:

774868608

14955736


Michael suggested using Block to set $HistoryLength but this doesn't actually work. Instead his code functions by a different method: it never assigns the output of the Sum to Out[], because that line returns MemoryInUse[]. The same thing can be done with with CompoundExpression:

d = 2000;
f[x_, y_, d_] = Sum[Subscript[a, i, j]*x^i*y^j, {i, 0, d - 1}, {j, 0, d - i}]; 1;
MemoryInUse[]
Clear[f];
MemoryInUse[]

774872048

14957200

The key is:

expr; 1;

Now the value set for Out[] is 1 rather than expr.

You may wonder why expr; assigns anything to Out[] -- this is intended and useful behavior because you often want to suppress the output of a line and reference it in the line below using %. expr; is short for CompoundExpression[expr, Null], which is recognized and handled to set Out[] to the evaluated expr instead of Null.

Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
  • I don't know what is my default $HistoryLength. I just look at the memory usage showed in taskmgr. After using MemoryInUse, it shows that the reduced memory is very little if I don't use $HistoryLength. – user565739 Aug 17 '13 at 17:38
  • 1
    @user565739 If you didn't change it, your default is Infinity. – Ruslan Aug 17 '13 at 17:40
  • 2
    @user565739 You shouldn't use taskmgr is that doesn't show memory that is actually in use but rather that which the application hasn't released; it's not the same thing. If another application needs the memory it should be available. – Mr.Wizard Aug 17 '13 at 17:41
  • 1
    @Mr.Wizard well if an application hasn't released some memory, other apps can't access it (unless it's swapped out). But taskmgr shows memory used by apps + caches etc. (starting from windows vista), which will mislead you if you try to detect when an app releases some memory. – Ruslan Aug 17 '13 at 17:44