21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
klump
Profil *
Zdravím, mám problém. Psal jsem skript, který zpracovával soubor, ve kterém bylo cca 300.000 řádků (četl jsem soubor po řádku a s každým řádkem prováděl to samé) a ejhle, zjistil jsem, že spotřeba paměti strašně moc roste. Různě jsem experimentoval a nakonec jsem stvořil takovýhle primitivní kód:

index.php:
<?php
require("./fce.php");
$a = 10;

for($i = 0; $i <= 20; $i++)
{
test($a);
echo "Pamet:".memory_get_usage()."<br>";
flush();
}
?>

a soubor fce.php:
<?php
function test($a)
{
for($j = 0; $j <= 8; $j++) $w[] = $a;
}
?>

Jde mi o to, že když v té funkci test() jde $j od 0 do 7 (a méně), vypisuje memory_get_usage() stale stejne cislo (coz je asi logocké, není důvod, aby skript zabíral více paměti), ovšem při $j od 0 do 8 a více se využívání paměti stále zvětšuje...
Tušíte někdo proč, prosím?
klump
Profil *
nevim, esi se ptam blbe nebo nejasne...kazdopadne na to nemuzu vubec prijit...a docela dost by me to zajimalo...mate aspon nekdo podobnou zkusenost?
klump
Profil *
nevim, jestli se ptam blbe nebo nejasne...kazdopadne by me to velmi zajimalo...mate alespon nekdo podobnou zkusenost?
koudi
Profil
Jak moc zvětšuje?
klump
Profil *
v tomhle případě je to o 32 bytů při každém průchodu. Vypisuje to:
Pamet:42972
Pamet:43084
Pamet:43148
Pamet:43180
Pamet:43212
Pamet:43244
...
...
klump
Profil *
pokud mam v tom forcyklu $j od 0-7 (8 průchodů), využívá to stále stejně paměti, pokud je 9-16 průchodů, zvětšuje se využití paměti po každém volání test() o 32 bytů, pokud je to 17 a víc, zvětčuje se to o 96 bytů...
dracek
Profil
32 bitů, není to "náhodou" velikost nějakého datového typu? :)
klump
Profil *
no a kdyby jo...? prirazuju prece do ty samy promeny tu samou hodnotu....

kdybych to pole zvetsoval nebo neco..tak to chapu....ale takhle opravdu ne...
K.
Profil *
Nějak extra jsem to nestudoval, ale v té fci test přece přidáváš hodnotu $a do pole $w právě tolikrát, kolik proběhne iterací. Takže když, zvýšíš počet iterací, tak zvětšíš počet prvků pole a tím pádem by to mělo zabírat více paměti.
Je to tak a nebo jsem to špatně pochopil?
nightfish
Profil
K.
akorát ta proměnná $w je lokální, všechny proměnné vytvořené ve funkci test() by měly být při jejím ukončení zrušeny...
klump
Profil *
no prave..jak pise nightfish ..ta promenna je lokalni...to pole by melo zaniknout a dalsi iteraci provadim presne to same..tak proc je najednou treba vice pameti...
K.
Profil *
Pokud vím, tak Garbage collector nemusí dealokovat paměť okamžitě, ale třeba až po nějaké době, kdy není procesor tolik zatížen (tak to myslím funguje třeba v Javě).

Co se stane, když explicitně zrušíš proměnnou pomocí unset($w)?
klump
Profil *
K.

při použití unset se nestane nic...dělá to stále to samé...

k tomuhle příkladu jsem se dostal až poté, kdy jsem napsal skript, který četl po řádcích obrovskej soubor a ty řádky zpracovával... Volal jsem funkce, které vracely nějaké výsledky, používaly pouze lokální proměnné, nevytvářely žádné složité datové struktury..nic. No a nastal případ, kdy skript využíval přes 50 procent pameti.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0