Jak zamezit bobtnání paměti při velkém selectu

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

Potřebuji udělat import z jiné db a během toho upravit data asi takto

$data = $db1->table('tabulka1')->limit(2000000);
foreach ($data as $item) {
   $item = upravItem($item);
   $db2->insert($item);
}

Bohužel mi to při větším počtu záznamů vyčerpá paměť, nejspíš hlavně proto, že výsledek selectu tzn. $data se nabaluje. Jak můžu opustit už zpracovaný řádek, abych jej nedržel v paměti?

Zkušel jsem si tahat jen id a potom vytáhnout jen jeden řádek nicméně to je zase hrozně pomalé.

Mariocz
Člen | 52
+
0
-

Rozděl si to na části – vytáhni třeba 20k záznamů, uprav, ulož a pak další sadu.

edit: a pokud můžeš spouštěj to přez cli. tam bývá větší limit pro paměť.

Editoval Mariocz (7. 5. 2014 15:04)

ji_ri_k
Člen | 44
+
0
-

Máš zapnuté logovaní SQL do Debug panelu? Vypni si ho. Každý provedený SQL dotaz se loguje a zabírá paměť.

skrivy
Člen | 52
+
0
-

Pokud je podporovane unbuffered query, tak to by melo byt resenim.

iguana007
Člen | 970
+
0
-

Přesně jak píše skrivy … viz. třeba: http://www.mysqlperformanceblog.com/…rts-of-data/

hrach
Člen | 1844
+
0
-

pouzit fetch() misto fetchAll.

tomasn
Člen | 8
+
0
-

Díky za rady. V podstatě jedinné co pomohlo bylo přepsaní do mysqli.
Vypnutí debug panelu pomohlo mírně.
Unbuffered jsem nezkoušel, nicméně předpokládám, že by se to ještě kousek pomohlo mysqli.
V momentě kdy použiju nette database tak se do objektu, který je výsledkem dotazu, ukládá všechno co se použije tzn. každý sloupec i řádek a nepodařilo se mi to udělat tak, aby to nedržel v paměti a zpracovával jen po řádcích.