phpbar.de logo

Mailinglisten-Archive

[php] Speichergrenze fuer Arrays in PHP

[php] Speichergrenze fuer Arrays in PHP

Sebastian Mendel lists at sebastianmendel.de
Mit Feb 15 10:51:46 CET 2006


Norbert Pfeiffer wrote:
> Hi Sebastian,
> 
>>> Man muss auch beachten, dass man soviele unset($irgendwas);
>>> einfuegen kann, wie man will. Waehrend des aktuellen Laufes
>>> wird der RAM nicht wieder verfuegbar.
>> nicht wieder verfügbar für andere Prozesse (außerhalb PHPs)
>> aber PHP selber kann den so 'freigegebenen' Speicher für was
>> anderes verwenden.
> koennte !!!
> a - wie ich schon schrieb, mit unset(); ist die Variable
>     zwar weg, aber der RAM nicht wieder verfuegbar - test it
> b - keine Scriptsprache gibt den RAM waehrend des Runs an das
>     BS zurueck, was man leicht asprobieren kann, indem man das
>     Script animiert immer neuen Speicher zu allocieren und
>     paralell alten RAM "freizugeben". Diese Schleife endet

<?php
if (! function_exists('memory_get_usage')) {
     echo 'cannot run memorytest, needs --with-memory-limit';
     exit;
}

/**
  * testing memory consumption
  */
$loops  = 1000;
$data   = str_repeat('X', 1000);

echo 'Memory before unset loop: ' . memory_get_usage() . "<br />\n";

for ($i = 0; $i < $loops; $i++) {
     $varname = 'var' . $i;
     $$varname = $i . $data . $i;
     unset($$varname);
     echo 'unset loop ' . $i . ': ' . memory_get_usage() . "<br />\n";
}

echo 'Memory after unset loop: ' . memory_get_usage() . "<br />\n";
echo 'Memory before loop: ' . memory_get_usage() . "<br />\n";

for ($i = 0; $i < $loops; $i++) {
     $varname = 'var' . $i;
     $$varname = $i . $data . $i;
     echo 'loop ' . $i . ': ' . memory_get_usage() . "<br />\n";
}

echo 'Memory after loop: ' . memory_get_usage() . "<br />\n";
echo "\n" . '<hr />finished';
?>

------------------------------------

php-Version: 5.1.2 - php-OS: Linux -
Memory before unset loop: 53312
unset loop 0: 53352
unset loop 1: 53352
...
unset loop 999: 53440
Memory after unset loop: 53440
Memory before loop: 53440
loop 0: 54448
loop 1: 55496
...
loop 999: 1132904
Memory after loop: 1132904
finished


>     immer mit einem Scriptabbruch und unter Windoof auch schon
>     mal mit dem Niedergang des BS ... ;-)

Windows ... kennt ja auch kein memory_limit und somit auch kein 
memory_usage() da kann man das eh nicht testen


-- 
Sebastian Mendel

www.sebastianmendel.de
www.sf.net/projects/phpdatetime | www.sf.net/projects/phptimesheet

php::bar PHP Wiki   -   Listenarchive