• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Symfony - ORM Flush - optymalizacja

Cloud VPS
0 głosów
256 wizyt
pytanie zadane 27 kwietnia 2020 w PHP przez XiverKi Bywalec (2,050 p.)
zamknięte 28 kwietnia 2020 przez XiverKi
hej,

Sytuacja wyglada tak:

Mam CSV 57 tysiecy rekordów, które wrzucam do bazy jeden po drugim.

Do około 15000 szło całkiem sprawnie. Po tej liczbie program strasznie zwolnił.
Flush wykonuje się około 1.5 sekundy. Wydaje mi się, że jest to na prawde długo biorąc pod uwagę, że obiekty, które umieszczam są bardzo proste. Składają się z 3 pól w tym jedno to relacja do innego tabeli.
Całą operację wykonuje na procesorze i5 - 82XXU.

HTOP pokazuje 98% zużycia na wątku. Jest szansa na zoptymalizowanie takich działań? Przyznam szczerze, że troche mnie to dziwi, że Doctrine potrafi tak zamulać, sądziłem, że jest to szybsze narzędzie.
komentarz zamknięcia: rozwiazanie

1 odpowiedź

0 głosów
odpowiedź 27 kwietnia 2020 przez Ehlert Ekspert (215,050 p.)
wybrane 28 kwietnia 2020 przez XiverKi
 
Najlepsza

Korzystasz z... Fpm?

Stawiam że nie robisz clear'a na entity manager'ze i trzyma wszystko w pamięci. A po co. Wykorzystaj Batch processing 

komentarz 27 kwietnia 2020 przez XiverKi Bywalec (2,050 p.)
edycja 27 kwietnia 2020 przez XiverKi

Tak fpm.

Jeżeli chodzi o czyszczenie to faktycznie nie wywoływałem tej metody ale pamięć oraz swap nie wyglądały na nadwyrężone, były w porządku. Jedyną różnicę widziałem na procesorze, który miał 100% na wątku, który wykonywał ten proces.

Przeglądam link, który podesłałeś i jednej rzeczy nie rozumiem.

<?php
 [...]
    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();

Czy ten pierwszy clear.

        $em->clear(); // Detaches all objects from Doctrine!
Nie wyczyści czasem wszystkiego co do tej pory znajdowało się w pamięci?

W takim razie metoda:

$em->flush(); //Persist objects that did not make up an entire batch

Nie ma już sensu, bo nie ma czego dodawać. Chyba, że mówimy o sytuacji, w której skrypt omija pętle, a mimo wszystko ma jakiś obiekt do dodania i dlatego je wywoływana mimo to.

 

komentarz 27 kwietnia 2020 przez Ehlert Ekspert (215,050 p.)
Ustawiasz sobie rozmiar batcha na 50. Tworzysz i perzystujesz 49 obiektów. Po 50 if masz spełniony więc leci flush i zapis wszystkich obiektów do bazy i następnie clear który sprawia że te obiekty znikają z pamięci em.

Podobne pytania

0 głosów
1 odpowiedź 432 wizyt
pytanie zadane 11 czerwca 2017 w PHP przez marcin99b Szeryf (84,410 p.)
0 głosów
0 odpowiedzi 194 wizyt
pytanie zadane 10 maja 2020 w PHP przez XiverKi Bywalec (2,050 p.)
0 głosów
2 odpowiedzi 321 wizyt
pytanie zadane 5 października 2019 w PHP przez niezalogowany

93,462 zapytań

142,456 odpowiedzi

322,725 komentarzy

62,840 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...