Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony]Generowanie sitemapy, brak pamieci
Gribo
post
Post #1





Grupa: Zarejestrowani
Postów: 237
Pomógł: 17
Dołączył: 1.11.2007
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


Witam
mam taki problem próbuję wygenerować sobie wielką mapę strony. jedna tabela w bazie ma ponad 150 tysięcy rekordów.
Problem jest taki że pobieram w jednym zapytaniu to wszystko następnie chce pobrać inne rekordy z innej tabeli około 30 i wywala przepełnienie pamięci (memory_limit). dlaczego Propel nie zwalnia użytej pamięci w pierwszym zapytaniu ? Próbowałem na wszystkie sposoby to jakoś wyczyścić i nic unset() nie działa, ręce już mi opadają.
Nawet jak próbuję pobierać rekordy po kilka tysiaków to dochodzi do tego momentu że wywala błąd memory_limit.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
Mephistofeles
post
Post #2





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


Wszystko hydrujesz jako obiekty?
Go to the top of the page
+Quote Post
Gribo
post
Post #3





Grupa: Zarejestrowani
Postów: 237
Pomógł: 17
Dołączył: 1.11.2007
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


nie z obiektów zrezygnowałem i pobieram jako tablice tylko jedną kolumnę slug która mi jest potrzebna do budowania linków
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Może dlatego, że wszystko dzieje się w ramach jednego skryptu? Domyślnie zapewne pamięć nie jest zwalniana do czasu zakończenia skryptu, przez co pamięć powoli się zapełnia i w pewnym momencie dochodzisz do limitu. Nie wiem jak ma to rozwiązane symfony, bo tego FW nie używam, ale zapewne masz odpowiednik takich funkcji jak mysql_free_result, które zwalniają pamięć przydzieloną do resource. Myślę, że to w połączeniu z porcjowaniem wyników powinno pomóc przy rozwiązaniu problemu
Go to the top of the page
+Quote Post
Gribo
post
Post #5





Grupa: Zarejestrowani
Postów: 237
Pomógł: 17
Dołączył: 1.11.2007
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


A czy jest takie coś w Propelu bo jakoś przewróciłem cały internet i nie widzę nic podobnego
Go to the top of the page
+Quote Post
Quadina
post
Post #6





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Oczywiście, że jest zarówno w Propel jak i w Doctrine. Obiekty typu sfPropelPager() albo sfDoctrinePager() w dokumentacji znajdziesz dokładnie wszystko. Zmieniasz tylko stronę w pętli na kolejną i wykonujesz $pager->init(); kolejny raz. Pager sam zadba o zwolnienie poprzednich danych.

ALE!
Propel i Doctrine mają jedną i tę samą wadę - przepełniają pamięć hydrując wszystko. Polecam mniej joinować i wybierać jedynie te kolumny, które są potrzebne. Jeżeli i to nie pomoże to przy generowaniu sitemap możesz oczywiście zrobić skrypt który będzie redirectował do siebie przy następnej paczce danych, ale to już hardcorowe rozwiązanie (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Gribo
post
Post #7





Grupa: Zarejestrowani
Postów: 237
Pomógł: 17
Dołączył: 1.11.2007
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


problem w tym ze pobieram tylko jedną kolumnę z tabel bez joinów itp. a i tak pamięć wykorzystana to 198 mega (IMG:style_emoticons/default/exclamation.gif) ! i z każdym zapytaniem rośnie.
Go to the top of the page
+Quote Post
destroyerr
post
Post #8





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Możesz wyjaśnić dlaczego otagowałeś temat jako symfony? Możesz podać z jakiej wersji Propela korzystasz i jak pobierasz dane?
Go to the top of the page
+Quote Post
Gribo
post
Post #9





Grupa: Zarejestrowani
Postów: 237
Pomógł: 17
Dołączył: 1.11.2007
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


Cytat(destroyerr @ 1.12.2010, 18:01:20 ) *
Możesz wyjaśnić dlaczego otagowałeś temat jako symfony? Możesz podać z jakiej wersji Propela korzystasz i jak pobierasz dane?


proszę cię bardzo :
Propel: 1.4
Symfony 1.4.8
  1. $c = new Criteria();
  2. $c->addSelectColumn($column);
  3. $dane = FirmaPeer::doSelectStmt($c);
  4.  
  5.  
  6. inne operacje
  7.  
  8.  
  9. unset($dane);


wykonuje to sobie w pętli na kilku tabelach chyba z 6. 2 z tych tabel mają po 150 tysięcy wierszy. Wyciagam tylko po 1 kolumnie z każdej tabeli.

Ten post edytował Gribo 1.12.2010, 19:29:30
Go to the top of the page
+Quote Post
destroyerr
post
Post #10





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Wrzuciłem Twój kod do pętli i dostosowałem do swoich klas. Przed pętlą "zainicjowałem" Propela i mierzyłem użycie pamięci tylko dla pętli.
Wynik jest taki, że liczba iteracji nie wpływała na zużycie pamięci. Czyli pewnie coś w tych innych operacjach robisz tak, że PHP nie daje rady z wyczyszczeniem pamięci.
Go to the top of the page
+Quote Post
Quadina
post
Post #11





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Dla Twojego przykładu nie widzę innej opcji jak użycie sfPropelPager. Porcjowanie danych powinno zniwelować problem braku pamięci.
Go to the top of the page
+Quote Post
phpion
post
Post #12





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Wydaje mi się, że szukacie problemu w złym miejscu. Problemem może być to, że pobrane dane podczas iteracji zapisujesz np. do jakiejś tablicy, na podstawie której później budujesz mapę strony. Niestety nie pokazałeś co siedzi w kodzie w miejscu "inne operacje" więc to tylko mój domysł. Pakujesz kolejne elementy (może obiekty), które systematycznie zapychają pamięć.
Go to the top of the page
+Quote Post
Gribo
post
Post #13





Grupa: Zarejestrowani
Postów: 237
Pomógł: 17
Dołączył: 1.11.2007
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


Cytat(phpion @ 2.12.2010, 19:45:33 ) *
Wydaje mi się, że szukacie problemu w złym miejscu. Problemem może być to, że pobrane dane podczas iteracji zapisujesz np. do jakiejś tablicy, na podstawie której później budujesz mapę strony. Niestety nie pokazałeś co siedzi w kodzie w miejscu "inne operacje" więc to tylko mój domysł. Pakujesz kolejne elementy (może obiekty), które systematycznie zapychają pamięć.



chyba masz rację z tego całego skupienia się na optymalizacji propela zapomniałem że przecież ja cały czas powiększam tablice i to może być wina tego że mi wywala błędy
Go to the top of the page
+Quote Post
thek
post
Post #14





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Właśnie dlatego napisali tu chyba niemal wszyscy o zwalnianiu zasobów (IMG:style_emoticons/default/winksmiley.jpg) Zwalniałeś zasoby, które przychodziły z bazy, ale zapomniałeś o zasobach/zmiennych samego skryptu. No cóż... każdy ma chwile zaćmienia. Ja dziś na przykład zgłupiałem i ostatecznie z kumplem znaleźliśmy błąd skryptu w miejscu nieprzewidzianym... Tworzyłem AJAX, który miał posłać do skryptu datatable formularz, a więc elementy z polami miały atrybuty i musiałem uważać z obydwoma rodzajami apostrofów zanim całość potraktowałem funkcją json_encode. Użyłem htmlentities jak zawsze w wypadku ucieczki w value dla znaków specjalnych i... dostałem w wyniku nulla. Przez pół godziny ponad się motałem i sprawdzałem wszystko po kolei zanim doszedłem, że owa funkcja robi mi krecią robotę. Dopiero jej zmiana na htmlspecialchars sprawiła, że całość zadziałała. Kolejne punkty expa w webmasterce zaliczone )
Go to the top of the page
+Quote Post
Gribo
post
Post #15





Grupa: Zarejestrowani
Postów: 237
Pomógł: 17
Dołączył: 1.11.2007
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


a używałeś fiddler do śledzenia ajaxa mi to niesamowicie uproszcza robotę (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.09.2025 - 07:48