Wpis z mikrobloga

#programowanie #symfony2 #symfony

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ć?
  • 6
@qwelukasz: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/batch-processing.html

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();
@qwelukasz:

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
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?


@Jaslanin: w ogóle, jeżeli puszczę mniejszy okres albo mniejszą ilośc danych to #!$%@? ładnie

dobrze jest też wyłączyć SQL loggera

$em->getConnection()->getConfiguration()->setSQLLogger(null);


zobacze z tym

5. odnośnie samego kodu


kod pisałem na prędko jako przykład, w źródle wygląda to inaczej, tutaj w bardzo uproszczonej wersji ( ͡°