# Clear and Unset doesn't free memory

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.

-
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 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

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:
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. - 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
@user565739 If you didn't change it, your default is Infinity. –  Ruslan Aug 17 '13 at 17:40
@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