Aktywne Wpisy
Kasahara +187
Depresja trójboisty
Nie jestem osobą, którą by kiedykolwiek się żaliła; mimo, że większość mojego życia była pod górkę. Tytułem też nie chce obrażać osoby zmagających się z o wiele poważniejszymi problemami, przy których moje to pikuś.
Ano ale co się stało?
Z znowu wylądowałem w szpitalu. I to po raz kolejny właściwie nie w związku z powikłaniami tego co robię. W poniedziałek córka przyniosła jelitówkę, jak to dzieciak nie spał człowiek cały
Nie jestem osobą, którą by kiedykolwiek się żaliła; mimo, że większość mojego życia była pod górkę. Tytułem też nie chce obrażać osoby zmagających się z o wiele poważniejszymi problemami, przy których moje to pikuś.
Ano ale co się stało?
Z znowu wylądowałem w szpitalu. I to po raz kolejny właściwie nie w związku z powikłaniami tego co robię. W poniedziałek córka przyniosła jelitówkę, jak to dzieciak nie spał człowiek cały
foreach($entities as $entity) {
$dlFromNet = $entity->downloadXls();
foreach($dlFromNet as $xls) {
$row = new xls();
$row->setName()......
$em->persist($row);
}
$em->flush();
}
tak na szybko, prosty przykład.
Sprawa jestt taka żę w pętli dlFromNet wykonuję około 3000-5000 operacji, plików pobieram około 10 więc do bazy muszę wrzucić trochę danych.
Przy trzeciej pętli skrypt zaczyna znacząco zwalniać... mógłbym zrobić $em->clear(); ale wtedy tracę encje $entities...
Jak sobie z tym poradzić? flush co 1500 - 3000 rekordów nic nie daje...
Pozostaje rozbić entities na mniejszą ilość pętli ale to ostateczność..
Skrypt odpalam z poziomu konsoli
Jak to przyśpieszyć?
php
$batchSize = 20;
for ($i = 1; $i <= 10000; ++$i) {
$user = new CmsUser;
$user-setStatus('user');
$user->setUsername('user' . $i);
$user->setName('Mr.Smith-' . $i);
$em->persist($user);
if (($i % $batchSize) === 0) {
$em->flush();
$em->clear(); // Detaches all objects from Doctrine!
}
}
$em->flush(); //Persist objects that did not make up an entire batch
$em->clear();
@poh:
http://pastebin.com/qe1VyNXj
bo wykop psuje formatowanie
1. Czy problemem jest to że to się długo wykonuje w ogóle, czy to że się wykonuje długo gdy nie jest to robione częściami?
2. czy rzeczywiście zmierzyłeś że problemem jest duża ilość elementów tj. zrobiłeś częściami, zsumowałeś czas i wyszło że jest krócej niż puszczenie za jednym razem?
jeżeli tak spróbuj zwiększyć ilość pamięci, ewentualnie możesz próbować wymuszać garbage collectora: gccollectcycles
tylko
@Jaslanin: w ogóle, jeżeli puszczę mniejszy okres albo mniejszą ilośc danych to #!$%@? ładnie
zobacze z tym
kod pisałem na prędko jako przykład, w źródle wygląda to inaczej, tutaj w bardzo uproszczonej wersji ( ͡°