tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Nadměrná spotřeba paměti dibi::query

před 7 lety

souki
Bronze Partner | 22
+
0
-

Narazil jsem na problém, kdy se dibi nevešlo do paměti. Zkoušel jsem problém krokovat, ale nepodařilo se mi dostat blíže, tak to zkusím aspoň trochu popsat.

Vypnul jsem profiler, nechal zapnuté detekování typu a příkaz bylo jednoduché dibi::query uvnitř foreach nad obyčejným selectem s jednou where podmínkou. Výsledkem bylo cca 100 000 řádků a 57 sloupců (pouze int nebo date). Pochopil, bych, že by se do paměti (128M) nevešlo všech 100 000 řádků, ale při přístupu přes iterátor se přeci nemají načítat všechny. Tušil jsem problém u detekování typů, ale nepodařilo se mi to potvrdit. Když jsem dotazu dal limit, tak proběhl v pořádku. Stejně tak když jsem sloupce omezil na jeden, tak dotaz proběhl. Při krokování samotné mysql_query proběhlo bez problémů.

foreach(dibi::query("select ... where cas = %t",$cas) as $r){
  // pro účely testování se neprodávdí žádná akce uvnitř foreach
}

Omlouvám se za tak obecný popis a budu rád, když mě navedete, co bych měl hledat za problém. Dibi mám poslední verzi z GITu, php 5.3.6, apache, windows

před 7 lety

Milo
Nette Core | 1100
+
0
-

S přímým hledáním bohužel nepomůžu, tak objemnou tabulku nemám při ruce.

Jednou jsem s dibi narazil na memory limit, ale to bylo ve skriptu, který běžel jako daemon a nemohl se připojit k databázi. Paměť vyžraly anonymní funkce.

Jako první bych zkusil do DibiRow přidat destruktor a zkontroloval, jestli mizí na konci cyklu. Pak upravit metody iterátoru a pomocí memory_get_usage() zjišťovat, při jakém kroku paměť mizí. Bude to ale piplačka.

před 7 lety

souki
Bronze Partner | 22
+
0
-

Když jsem to zkoušel krokovat, tak mi přišlo, že to padlo hned v prvním řádku.
Neumí náhodou Netbeans při krokování nějak ukazovat spotřebovanou paměť? Pak by se to hledalo jednoduše. Nikde jsem to ale nenašel, takže asi neumí.

před 7 lety

HosipLan
Moderator | 4693
+
0
-

Zkus nainstalovat xhprof.

před 7 lety

David Grudl
Nette Core | 6790
+
0
-

Přetrvává problém u poslední verze? Detekování typů jsem zjednodušil.