Autor | Zpráva | ||
---|---|---|---|
klump Profil * |
#1 · Zasláno: 11. 7. 2007, 11:06:57
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 * |
#2 · Zasláno: 11. 7. 2007, 11:55:36
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 * |
#3 · Zasláno: 11. 7. 2007, 11:56:18
nevim, jestli se ptam blbe nebo nejasne...kazdopadne by me to velmi zajimalo...mate alespon nekdo podobnou zkusenost?
|
||
koudi Profil |
#4 · Zasláno: 11. 7. 2007, 11:56:58
Jak moc zvětšuje?
|
||
klump Profil * |
#5 · Zasláno: 11. 7. 2007, 11:59:28
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 * |
#6 · Zasláno: 11. 7. 2007, 12:10:54
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 |
#7 · Zasláno: 11. 7. 2007, 15:43:45
32 bitů, není to "náhodou" velikost nějakého datového typu? :)
|
||
klump Profil * |
#8 · Zasláno: 11. 7. 2007, 15:48:41
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 * |
#9 · Zasláno: 11. 7. 2007, 16:40:05
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 |
#10 · Zasláno: 11. 7. 2007, 16:42:21
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 * |
#11 · Zasláno: 11. 7. 2007, 16:45:09
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 * |
#12 · Zasláno: 11. 7. 2007, 16:50:53
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 * |
#13 · Zasláno: 11. 7. 2007, 16:57:40
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. |
||
Časová prodleva: 17 let
|
0