freeing memory

freeing memory

am 02.01.2008 23:46:20 von Mad Hatter

Hi folks

I have a script which reads the mysql database,does a lot of string
manipulation then writes its output to a file. The manipulation is all done
in a separate function which is called over and over again but with each
time it's called it's not releasing the memory allocated from the last
call. After a few Calls it's running out of memory. I'm using 'echo
memory_get_usage()' to check the usage and unset(variable names) to try and
free things up. Anyone tell me where I'm going wrong please.

Re: freeing memory

am 03.01.2008 18:29:09 von Erwin Moller

Mad Hatter wrote:
> Hi folks
>
> I have a script which reads the mysql database,does a lot of string
> manipulation then writes its output to a file. The manipulation is all done
> in a separate function which is called over and over again but with each
> time it's called it's not releasing the memory allocated from the last
> call. After a few Calls it's running out of memory. I'm using 'echo
> memory_get_usage()' to check the usage and unset(variable names) to try and
> free things up. Anyone tell me where I'm going wrong please.

Hard to tell based on this only.

A few ideas:
If your function finishes, you shouldn't unset anything used in that
function explicitly.
eg
function testmem(){
$IamOnlyHere = "blabla";
}

when you call testmem(), the variable $IamOnlyHere is only used during
your function, and is gone after the call.
Also the memory allocated is freed.
So no need to unset() it.

So my guess would be that you use some global variables or growing
variables in the scope of your script, like this (stupid example):

$IgetBig = "";
for ($i=0;$i<1000000;$i++){
$IgetBig .= getMore($i);
}
// probably never reach here, because out-of-memory
echo $IgetBig;

function getMore($number){
$returnThis = str_repeat("bla",$number);
}


In the above example $IgetBig is the variable that consumes all the
memory after a short while. Unsetting $returnThis in function getMore()
won't help.

Any chance some of the variables in the normal scope of the script are
growing too much? Or are you maybe using one of the superglobals to
store stuff, like $_SESSION?

If the above doesn't help you try something like this:

echo "

";
print_r($GLOBALS);
echo "
";

at some smart points in your script.
It produces all the variabels in use.
(Mind the $GLOBALS instead of the expected $_GLOBALS, expected by me at
least.)

Good luck with the bughunt.

Erwin Moller

Re: freeing memory

am 03.01.2008 18:31:03 von Erwin Moller

correction:

function getMore($number){
$returnThis = str_repeat("bla",$number);
}

should be of course:
function getMore($number){
$returnThis = str_repeat("bla",$number);
return $returnThis;
}

but you probably guessed. :P

Erwin Moller

Re: freeing memory

am 04.01.2008 19:46:19 von Mad Hatter

Hi

> echo "

";
> print_r($GLOBALS);
> echo "
";

You've pointed me in the right direction. After a lot of searching it
turned out to be a variable outside the function that I was overlooking.

Thanks :-)