Nette\Database mimo frameworku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mochja
Člen | 20
+
0
-

Zdravím,

pokúšam sa vytvoriť inštanciu nettedb mimo konfigurátor, resp. mimo frameworku. Narazil som však na problém ak sa dotazujem pomocou fluent interface, nastane memory leak – pri 20k rows mem. usage cca 20MB.
Ak však napíšem dotaz pomocou metódy query mem usage je 2MB.

Je to spôsobené tým, že nepoužívam cache ? alebo je problém niekde inde ?

$db = new Nette\Database\Connection('mysql:host=127.0.0.1;dbname=test', 'root', '');

$data = $db->table('products')->select('id'); # 19MB
//$data = $db->query('select id from products'); # 2MB

foreach ($data as $row) {
	break;
}

Nette 2.0.10, PHP 5.4.9

Editoval mochja (9. 4. 2013 3:20)

Šaman
Člen | 2640
+
0
-

Odpověď neznám, ale mimo Nette bych možná doporučil spíš standalone knihovny jako NotORM nebo Dibi.

enumag
Člen | 2118
+
0
-

Můžeš vyzkoušet master? Tam by ty leaky měly být opravené.

mochja
Člen | 20
+
0
-

skúšal som to na df2a51a, výsledok je rovnaký.

enumag
Člen | 2118
+
0
-

Po unset($data) se paměť vrátí do normálu nebo ne?

mochja
Člen | 20
+
0
-

nie, pamäť poklesne iba o 18 bajtov.

19037232 – pamäť pred unset
19037144 – pamäť po unset

Editoval mochja (9. 4. 2013 8:10)

enumag
Člen | 2118
+
0
-

Jo jasně, $row si ještě referenci na selection uchovává takže se paměť neuvolní. Každopádně tohle není memory leak.

$data = $db->table('products')->select('id');

Tohle vrací Selection, které si ukládá do paměti všechny řádky.

$data = $db->query('select id from products');

Tohle vrací Statement, který si při procházení řádky nikam neukládá, vždy ti vrátí ten aktuální a předchozí zahodí.

$data = $db->query('select id from products')->fetchAll();

Schválně zkus ještě tento kód. Pokud se nemýlím, paměť by měla v tomto případě také vyskočit nahoru.

mochja
Člen | 20
+
0
-

vyskočí na 15 MB.