![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 8.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Czy normalne jest że ilość zwracanych danych przez obiekt sfOutputEscaperArrayDecorator (po wywołaniu polecenia doSelectJoinAll*()) jest nad wyraz duża? W sumie wygląda na to że pobierając np. jeden artykuł z tabeli z artykułami (czyli jeden wiersz) z bazy przy pomocy np. doSelectJoinAutor() by np. prócz ID autora dostać też jego Nazwisko (z osobnej tabeli 'Autor') -> Propel zwraca: 1) obiekt 'Artykuł' (ok) 1a) obiekt 'Autor' powiązany z poprzednim obiektem 'Artykuł' (ok) 1b) wszystkie obiekty 'Artykuł' powiązane z pobranym punkt wcześniej obiektem 'Autor' ( ![]() Czy idzie jakoś wyeliminować bezużyteczny pkt. 1b) ![]() Bo jeżeli chcę pobrać jeden artykuł i jego autora, to propel zwróci mi tenże artykuł oraz dane autora, a poza tym 1000 obiektów typu 'Artykuł', które należą do tegoż autora.... Poprawnie to rozumiem? Jak tego uniknąć? ![]() ================================================================ Przykład: Kod PHP:
Wygenerowane zapytanie przez w/w funkcję doSelectJoinCategory():
Zwrócone przez bazę wyniki:
( wiem że ostatnie pole może mało czytelne, ale WSZYSTKO do tej pory jest naprawdę super, tak jak powinno być! ) Tyle że........ podczas var_dump( $articles ) dostaję taki oto obiekt:
I to tylko dla jednego rekordu... Jakbym chciał pobrać ich 100, to aż strach pomyśleć jak obciążyłoby to pamięć :/. Obłęd. Ten post edytował Ravv 5.02.2009, 21:32:37 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Najlepszym rozwiazaniem jest vidok. Dodaje sporego kopa jesli chodzi o wydajnosc wyciagania danaych i wielki spadek zuzycia pamieci.
-------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 8.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Nie no, jeszcze widoki tworzyć? Tylko po to by móc korzystać z Propela i jednocześnie używać mało zasobów?
Szczerze powiedziawszy - co daje korzystanie z Propela?? Bo jak na razie doczytałem się jednego -> abstrakcyjności jeżeli chodzi o bazy, w tym głownie przytaczany przykład w stylu "jak będziesz chciał zmienić nazwę tabeli/kolumny"... Ale tak szczerze powiedziawszy -> kto zmienia nazwy tabel / kolumn po zakończeniu tworzenia projektu?!?! może 0,00000000000001% programistów... Po drugie: kto zmienia nawet bazę na inną (np. z MySQL na Postgre) ![]() Nie widzę jak na razie sensu korzystania z metod Propela. Co prawda pisanie 'zapytań' jest prostsze, ale z doświadczenia wiadomo że te samo zapytanie generujące identyczne wyniki za pomocą Propela a czystego SQLa trwa KILKA RAZY dłużej... Szczęście w nieszczęściu że Propel rusza taką samą liczbę wierszy. Przykład: Wynik: 3 wiersze z artykułami połączone z nazwami regionów oraz nazwami kategorii do których należą. Wygenerowane zapytanie przez PROPEL:
Zapytanie moje:
Wynik identyczny. W pierwszym przypadku Propel rusza o dziwo 2 tabele, w drugim ruszam aż 5, ale ilość ruszonych wierszy w obydwu przypadkach jest taka sama (odpowiednio: 2*3 i 2*1*1*3*1). Ale najciekawsza jest różnica w czasie - zapytanie Propela trwa 0,0027s, moje 0,0006s. [poprawka: czas jest także taki sam ;> - nie dałem w swoim zapytaniu sortowania... teraz już poprawione] Nie wspomnę już o 2MB różnicy w wykorzystaniu zasobów pamięci serwera... 2MB! - dla 3 zwróconych rekordów! Wiem że Ameryki nie odkryłem, ale jednak - różnice są ogromne. Dlaczego ludzie korzystają z Propela to wciąż nie wiem. Akurat plus w przenośności systemu moim zdaniem nie rekompensuje różnic w wydajności (użytkownicy odwiedzają stronę codziennie, a system przenosi się raz na parę lat i to może max z 2x)... PS. Nie wiem jak z Propelem, ale od kumpla programisty słyszałem że Doctrine potrafi wypluć takie wyniki z bazy, że var_dump() na obiekcie z wynikami powoduje zawieszenie się przeglądarki... ehhh. Po Propelu też się tego bym spodziewał patrząc na przykład z pierwszego posta. Interesuje mnie na razie jedno: Istnieje możliwość zmuszenia Propela do wyplucia obiektu wynikowego zawierającego TYLKO obiekty stworzone ze zwróconych przez bazę wierszy? (z pominięciem całych odzwierciedlonych tam struktur nikomu nie potrzebnych w normalnym wyświetlaniu wyników) ![]() Ten post edytował Ravv 5.02.2009, 15:28:59 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Ok, widze ze wiele teorii przed Toba. Co to Propel - szukaj w google ORM przeycztaj kilka art przemysl sprawe zanim zaczniesz pisac glupsta na forum. Nie ma sensu pisac, jest tyle materialow propel to nic nowego. W wiekszosci jezykow istnieje ORM. Co do obiektow ktore wypluwa propel, fakt zgadzam sie ze to troche zajmuje w pamieci. Ale nie sadze ze w Twoim projekcie zawsze chcesz wykorzystywac wszystkie dane z tabeli. Kolejna rzecza to teoria baz danych, nie wiem czy wiesz ale zwracanie wynikow z calej tabeli ( wszystkich pol ) jest wolniejsze od "kilku" pol - nie wierzysz sprawdz, ale to mam nadzieje ze dla Ciebie jest logiczne. Idac dalej jesli robisz zlaczenia do wielu tabel to oczywiste ze kazdy orm bedzie budowal obiekty ze wszystkich danych - a co za tym idzie, zużycie pamięci bedzie wzrastać. Do daje vidok to chyba nie musze tlumaczyc - propel ma mozliwosc zbudowania modelu do odczytu z vidoku. To sa rzeczy tak logiczne i wynikajace same z siebie ze chyba nie trzeba tlumaczyc.
-------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 8.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
No tak, rację masz że ORM stanowi dla mnie (jeszcze?) tajemnicę, mimo to jeżeli var_dump() na wynikach średnio skomplikowanego zapytania (nie mówię tu o systemie bloga, prostej stronki z cms'em, tylko bardziej rozbudowanego systemu / portalu) powoduje zawiechę przeglądarki (lub błędy serwera typu 'Memory Exhausted') to chyba coś z tym nie tak...
PS. Co do wypisywania głupstw - gdzie Ty głupstwa widzisz? ![]() Pobierając tylko 3 artykuły (bo tyle chcę wyświetlić) z dołączonymi _wartościami_ pól xxx_id będącymi kluczami obcymi do innych tabel - Propel wypluwa takiego giganta, że nawet jakbym chciał przytoczyć go tutaj na forum, to nie da rady bo kilkunastokrotnie przekracza to możliwą długość posta. Dla 10ciu pobranych artykułów na bank przeglądarka przestała by odpowiadać (mówię ciągle o var_dumpie() na tymże obiekcie)... Czy to ja robię coś nie tak, czy też wszystko jest "w porządku" (czyt. nikt na to nie zwraca uwagi, nawet nie wie co to var_dump())? pozdro. Ten post edytował Ravv 6.02.2009, 10:02:00 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 1 385 Pomógł: 55 Dołączył: 1.03.2005 Skąd: śląsk Ostrzeżenie: (0%) ![]() ![]() |
ja się zastanawiam czy to z czym Ty masz problem było rozważane przez autorów Propela. przecież nad tym pracują ludzie raczej myślący. dlaczego oni takich problemów nie mają? dlaczego mimo wszystko wypuścili taką aplikację i dlaczego była ona dołączona do dosyć sporego frameworka Symfony? czyżby to wszystko było nieporozumieniem?
tak się tylko zastanawiam:) -------------------- aplikacje internetowe | Symfony
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 8.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Budując system do obsługi bloga, do obsługi galerii internetowej, do obsługi katalogu on-line - tak, można sobie pozwolić na zajęcie pamięci rzędu kilkunastu / kilkudziesięciu MB dla jednego żądania.... Ale np. robiąc portal, zaawansowany sklep itp - każdy MB zasobów jest na wagę złota. Z resztą błędy typu 'Memory Exhausted' są wg Ciebie przewidziane przez twórców? Pewnie nie, nawet przy ogromnych projektach...
Dlatego pewnie robię gdzieś błąd, ale nie wiem gdzie. Jeżeli normalne jest że pobranie tylko 3 wierszy z bazy (powiązanych przeróżnymi relacjami kilku tabel) zajmuje horrendalną ilość pamięci i tak ma być - to cieszę się że nie robię nigdzie błędu. Może źle to wszystko zabrzmiało co do tej pory napisałem -> nie chcę się kłócić, polemizować itp. bo się na tym nie znam. Wiem tylko tyle że wyciągając z bazy te durne trzy wiersze zjada mi 2MB pamięci, a var_dump() jest olbrzymi. Stąd moje rozważania, ubolewania itp. Nigdy nie mieliście z tym problemów robiąc duże projekty? Mi to jakoś spokoju nie daje :/. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 1 385 Pomógł: 55 Dołączył: 1.03.2005 Skąd: śląsk Ostrzeżenie: (0%) ![]() ![]() |
może coś z var_dump jest nie tak? też jak sprawdzam dla 12 wierszy z bazy (trochę joinów) to apache dostaje zadyszki i nie odpowiada. ale może to nie o to chodzi?
myślę, że twórcy Symfony nie stworzyli tego frameworka do budowy bloga czy innych takich skromnych aplikacji:) spróbuj Doctrine i najnowszego Symfony 1.2.4 - zobacz czy tam var_dump też zawiesza apache. -------------------- aplikacje internetowe | Symfony
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 8.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Z tego co wiem to Doctrine jest tak samo zasobożerny. Pobierane są chyba wszystkie powiązane ze sobą rekordy, nawet jak ich nie chcesz (i to nawet po kilka razy te same, co widać po var_dumpie). Tak gwoli zasady "a może programista będzie chciał ich użyć".
Kumpel który jest programistą nie-amatorem mówił że przy projektach robionych przez firmę gdzie pracował często zdarzało się że przy chęci wyciągnięcia 5ciu wierszy Doctrine pobierało dodatkowych kilkaset co powodowało błedy "Fatal error: Memory Exhausted..."... Patrząc na var_dumpy() wcale się nie dziwię. No i dlatego jakoś mam obawy w korzystaniu z Propela/Doctrine w Symfony przez doSelect, doSelectJoinAll itp. Jak aplikacja mi się rozrośnie i nagle zaczną się sypać błędy z pamięcią to nie pozostani nic innego jak przebudowa wszystkiego :/. Ten post edytował Ravv 6.02.2009, 11:55:46 |
|
|
![]()
Post
#10
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
@Ravv pomijajac juz sens propela bo to juz mam nadzieje ze wyjasnione. W SQLu ktory podales ktory wyrzuca propel masz tam jakiegos CROS JOIN "FROM `article` CROSS JOIN `thema`" podaj jakie kryteria ustawiasz.
Odnosnie tej pamieci napisze to kolejny raz - zwracasz wiecej wynikow, pol to tym wiecej pamieci PHP potrzebuje na obsluzenie tego - to chyba oczywiste. Jesli chesz optymalizowac dbac o pamiec to widoki sa 1 krokiem do tego. -------------------- |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 8.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Baza:
Cel: pobranie trzech najnowszych artykułów. Artykuły muszą mieć status opublikowanych, kategorie do których należą również, tematy do których należą kategorie - też muszą mieć status opublikowane. Kryteria:
Generowane zapytanie:
var_dump'a nie wrzucę bo za duży, ale z tego co na szybkiego widzę stworzono po 13 obiektów tego samego artykułu (czyli 39 obiektów Article) itd. Wiem że gdzieś robię błąd (oby!), dlatego byłbym rad za wskazanie. Ten post edytował Ravv 6.02.2009, 13:03:15 |
|
|
![]()
Post
#12
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
No to teraz zobacz - ArticlePeer::doSelectJoinAll($c); pobiera Ci obiekty Article wraz z powiazanymi, nigdzie nie wyspepuje w kluczu thema. Zeby to wszystko polaczyc musisz dodac $c->addJoin( pole, pole );
-------------------- |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 8.02.2006 Ostrzeżenie: (0%) ![]() ![]() |
Zacząłem kombinować z tymi kryteriami sukcesywnie zmniejszając liczbę powtórzeń obiektów. Niestety przy doSelectJoinAll() najmniejszy wynik to 6 (docelowo: 3). Próbowałem przez doSelect() i 3 addJoin'y -> prawie zadowalający wynik - 3 artykuły, ale bez powiązanych obiektów.
Tak w ogóle to w dokumentacji jest błąd, konkretnie > TUTAJ <, ponieważ pokazany przykład nie jest tożsamy z podanym tam zapytaniem, ponieważ zamiast SELECT * ..., doSelect() pobiera tylko kolumny z jednej tabeli :/. Szkoda... Coś czuję że znów czeka mnie nieprzespana noc by dojść do tego jak powinny wyglądać te kryteria, by dostać 3 obiekty artykułów + obiekty powiązane z każdym z nich. Zły Propel, zły! Jak się walą w dokumentacji, ehh... Ten post edytował Ravv 6.02.2009, 14:26:49 |
|
|
![]()
Post
#14
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Jest tak jak powinno byc. W jednym zapytaniu chesz otrzymac obiekty zalezne ale pomiedzy nimi jest jeszcze tabela. Najrozsadniej jest uzyc widok i wtedy zwracasz co chcesz.
-------------------- |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 1 385 Pomógł: 55 Dołączył: 1.03.2005 Skąd: śląsk Ostrzeżenie: (0%) ![]() ![]() |
utworzyć widok w bazie to jest jedno rozwiązanie, innym może być samemu utworzenie albo poprawienie metod doselectjoinall.
-------------------- aplikacje internetowe | Symfony
|
|
|
![]()
Post
#16
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
@AxZx Tylko poprawienie metod nie zmieni Ci zbyt wiele w ilosci zajetej pamieci, chyba ze bedziesz zwracal odpowiednie pola, ale to zawsze cos.
-------------------- |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 1 385 Pomógł: 55 Dołączył: 1.03.2005 Skąd: śląsk Ostrzeżenie: (0%) ![]() ![]() |
a po co tworzyć widoki? po co w ogóle robić te dodatkowe metody? tzn po co zmuszać Propela do generowania dodatkowych metod? można w schema.yml nie podawać kluczy obcych - wtedy nie będzie dodatkowych obiektów dołączał, które czasem są nie przydatne.
a jak później jest z hydrate takiego widoku? gdy chcemy mieć dane z 5 tabel? nie będzie problemów? -------------------- aplikacje internetowe | Symfony
|
|
|
![]()
Post
#18
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Widok w propelu to tak naprawde model do oczytu. A jakie dane sa zwracane to tylko zalezy od struktury vidoku. Hydrate w Propelu jest defaultowy. Postaram sie art zrobic i wrzuce na bloga to pozniej podesle link z przykladami. Czesto takie zabiegi stosujemy w pracy w celu przyspieszenia Propela i zmniejszenia pamieci.
-------------------- |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 1 385 Pomógł: 55 Dołączył: 1.03.2005 Skąd: śląsk Ostrzeżenie: (0%) ![]() ![]() |
aaa, rozumiem. czyli po prostu w schema.yml tworzysz widok a nie tabele?
tylko to jest chyba strasznie sztywne rozwiązanie. no i jeszcze nie wiem za bardzo jak to ugryźć. załóżmy, że mam model profil. tam nadpisałem metody lub stworzyłem nowe metody np. getNazwa, setPseudonim itd. tworząc widok, który miałby pobierać dane profilu połączone jeszcze z 5 innymi metodami z których metod będę mógł skorzystać? czy tych z modelu profil czy tylko tych z modelu tego widoku? ![]() EDIT: już wiem o co chodzi http://zawadzinski.com/2008/01/15/how-to-u...ews-in-symfony/ trzeba będzie spróbować to wdrożyć:) a nie czekać, aż serwer sam zdechnie. aczkolwiek nie wiem czy jest sens, bo może się okazać, że taniej wyjdzie przenieść się na dedyka i dokładać RAM. -------------------- aplikacje internetowe | Symfony
|
|
|
![]()
Post
#20
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
Uwierz mi ze nawet jesli przenieszesz to na dedyka ( nawet bardzo dobrego - RAM, CPU ) i dalej bedziesz mial tyle zaleznych obiektow to i on nie da rady, wiem to z doswiadczenia. Takie rzeczy od razu robic podczas fazy 1 implementacji. Rozumiem ze sie projekt moze zmieniac ale trzeba o tych rzeczach myslec - wiele opinii jest na temat Symfony ze to pamieciozerne, ze wolno chodzi - a prawda jest taka, ze jak sie nie mysli o tych rzeczach to taka teorie mozna przyjac, ktora jest dla mnie bardziej brakiem doswiadczenia niz bledna koncepcja developerow symfony. Zasada jest prosta - zwracaj to co Ci jest potrzebne.
Symfony - przyśpieszanie Propela z wykorzystaniem widoków (view) baz danych Ten post edytował SongoQ 7.02.2009, 13:02:41 -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 15:09 |