Autor Zpráva
Pavel_M
Profil *
Zdravím, poradil by mi někdo, prosím, jak co nejlépe uložit více řádků do databáze? Mám pole kde je cca 15k položek a chtěl bych je ukládat do databáze (MySQL). Uloží se však pouze 3500 položek pak script padne na paměti. O tom, že je potřeba změnit nastavení serveru aby zvládal více paměti vím, ale chtěl bych se poradit jestli je možné to řešit i nějak jinak než změnou nastavení hostingu.

Řešením by asi byloo nějak vyčistit paměť po X iteracích, ale nějak se mi to nedaří. Našel jsem pár návodů s flush nebo gc_collect_cycles, ale bohužel to nepomohlo. Poslední testovací verze je zde:

$iter = 0;
        ob_start();
        foreach ($products as $product) {
            $iter++;
            $this->productFacade->saveProduct($product, [], $userId);

            if ($iter === 3500) {
                $iter = 0;
                gc_collect_cycles();
                sleep(2);
            }
        }
        flush();
        ob_clean();

Jinak je to část kódu, celé to je postavené na nette a využívám pro práci s db nette database. Pro ukládání položek z výše uvedeného kódu využívám Nette\Database\Connection a query aby insert z nette database nevytvářel ActiveRow (a tím ubíral paměť)

Díky za případné rady.
N71
Profil *
Z tohoto kusu kódu nikdo nic nepozná. Použití output bufferu tady nedává smysl, a že existují nějaké gc_* funkce si úplně vymaž z hlavy.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0