Oznámení
Nadměrná spotřeba paměti dibi::query
před 8 lety
- souki
- Bronze Partner | 22
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 8 lety
- Milo
- Nette Core | 1119
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 8 lety
- souki
- Bronze Partner | 22
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 8 lety
- HosipLan
- Moderator | 4693
Zkus nainstalovat xhprof.
před 8 lety
- David Grudl
- Nette Core | 6806
Přetrvává problém u poslední verze? Detekování typů jsem zjednodušil.