![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 1 Dołączył: 23.05.2007 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Pracuje wlaśnie nad projektem z wykorzystaniem frameworka Symfony i pojawił sie pierwszy problem. Problemem jest wydajność Propel-a. Fragment opisu schematu bazy danych:
Jak widać są tu 3 tabele test, asnwer, i tabela test_answer która odpowida za relacje "n do m" W skrypcie PHP mam:
No i w tym momencie pojawił się problem z wydajością PROPELa. Czas tworzenia kolekcji $test_answers rośnie po exponencie;) przy limicie ustawionym na 200 skrypt zostaje zakończony w wyniku przekroczenia limitu czasu(60sekund). No a wszystkich odpowiedzi mam do pobrania 214. W narzędziu WebDebug (część frameworka Symfony) widze, że wykonywane są tylko dwa zapytania do bazy: 1* pobranie testu 2* pobranie danych z tabel test_answer złączonej z answer Czyli nie ma problemu z zapętlaniem zapytań do bazy danych. Zresztą robie wszytsko zgodnie z instrukcją propel.phpdb.org/trac/wiki/Users/Documentation/1.2/ManyToManyRelationships Czy Propel jest aż tak mało wydajny? ![]() Potrzebuję pełnych danych odpowiedzi na pytania testowe do przeliczenia wyników końcowych. Mogę oczywiście obejść Propela, skorzystac bezposrednio z Creola i operować na tablicach zamiast na obiektach. No ale zastanawia mnie ta bardzo niska wydajność. Jakieś pomysły? ![]() ![]() Ten post edytował joebezucha 2.07.2007, 15:19:31 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 211 Pomógł: 3 Dołączył: 29.07.2005 Skąd: Szczebrzeszyn Ostrzeżenie: (0%) ![]() ![]() |
żeby mi działało zrobiłem takiego sql'a (bo masz odwołania do tabel których nie ma)
do tego wstawiałem: - 1 wiersz do tabeli "test" (bo jak robisz $this->test = TestPeer::retrieveByPk(1); to więcej mi nie trzeba)
- 200 wierszy do tabeli "answer"
- 200 wierszy do tabeli "test_answer"
widok dla akcji:
i teraz dla wywołania akcji:
robi 2 zapytania
wyświetla Cytat int 10 int 10 czas wykonania według webdebug: # 250 ms jak usuniesz linie
to odpowiednio robi 2 zapytania
wyświetla Cytat int 200 int 200 czas wykonania według webdebug: # 3030 ms jak widać nic złego się nie dzieje... sprzęt testowy: - system ubiuntu 7.04 - sempron 2600+ (64bit) - 1024 ramu - mysql Ver 14.12 Distrib 5.0.38, for pc-linux-gnu (i486) using readline 5.2 - PHP Version 5.2.1 nie wiem czemu u Ciebie coś się złego dzieje, chyba że ja coś za bardzo uprościłem ale nie wydaje mi się Ten post edytował pawel_k 2.07.2007, 17:58:32 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 1 Dołączył: 23.05.2007 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za wysiłek pawel_k
Jeszcze dziś sprawdzę czy z uproszczeniem schematu bazy to będzie hulać jak trzeba... Bez uproszczeń sprawdzałem wydajność w zależności od setLimit(limit) czasy są w [ms] limit; query time; module/action time; full time; 1; 1.99; 459; 1328; 5; 1.72; 356; 1009; 10; 3.30; 529; 1196; 20; 2.20; 1000; 1756; 40; 2.32; 3839; 4487; 80; 2.70; 12414; 13167; 160; 3.90; 46567; 47259; Jak widać do 20 jest OK ale potem lawinowo wzrasta czas procesu ORM... Puki co zrobiłem to troche inaczej tzn robie własne złączenie tabel i pobieram bezposrednio obiekty klasy Answer. w akcji mam:
No i tutaj działa wszystko OK. Wyglada na to ze problem z wydajności występuje gdy Propel pobiera obiekty TestAnswer i jednoczesnie agregowane przez nie obiekty Answer. Moj komp: Athlon XP 1800+ RAM 896 MB WIN XP SP2 Dam znać jak wypadły testy z uproszczonym schematem bazy danych Zrobilem osobny projekt ze schematem uproszczonym do tej postaci co w poscie Pawła K. Niestety problem wydajnosci ciagle występuje. Czasy minimalnie sie zmniejszyły pownieważ mniej danych jest pobieranych no ale wykonanie trwa i tak grubo ponad 40sekund:/ Ktoś ma jakies pomysły w czym może tkwić problem?? Paweł jakiej wersji Propela uzywasz? ![]() Ten post edytował joebezucha 5.07.2007, 08:46:59 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 211 Pomógł: 3 Dołączył: 29.07.2005 Skąd: Szczebrzeszyn Ostrzeżenie: (0%) ![]() ![]() |
trochę pogadałem z joebezucha, wykonałem kod na zrzucie jego bazy i wszystko jest ok. przy pierwszym sposobie
czas wykonania wynosi dalej ok 3000ms, nawet nie jest to więcej niż przy uproszczeniu, czasem nawet mniej... przy drugim sposobie czas wykonania to ok 250ms czasu są podawane przez webdebuga. dla mnie powodem może być widowsowa wersja php... |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 43 Pomógł: 1 Dołączył: 23.05.2007 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
No i chyba juz wiem w czym problem.
Dotąd aplikację odpalełem pod WAMPem. Większośc z podstron generowana byla przez okolo 1sekunde (dość sporo jak na proste wyswietlenie danych obiektów) Zainstalowałem najnowsze PHP 5.2.3, Upgrade PEAR (z problemami) No ale czas wykonania problematycznego skryptu byl ciągle bliski 1minuty. Problem nie istnieje natomiast na platformie LAMP (instalacja na Ubuntu 7.04, PHP 5.2.1) Większość podstron generowana jest w czasie 250-500ms a problematyczny skrypt około 3-4sekund Także wyglada na to ze ogołnie pod Windowsem jest slabsza wydajnośc przetwarzania skryptów no a moj przypadek to juz wogóle skrajna sytuacja... Inna sprawa to tez dziwny problem z upgradem PEAR pod windowsem. Przy upgradzie oraz przy instalacji paczek ciągle wywalał błąd braku pamięci (przekroczenie 8MB). Jednak zmiany w php.ini (memory_limit) nic nie pomagały. Pomogło dopiero dodanie w pliku pearcmd.php lini:
tak 100MB ![]() Przy upgradzie PEAR pod Ubuntu takiego problemu nie było! Także podsumowując zraziłem sie do WAMPa ![]() |
|
|
![]() ![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 569 Pomógł: 0 Dołączył: 17.08.2003 Skąd: Dąbrowa Górnicza Ostrzeżenie: (0%) ![]() ![]() |
a moze ktos z was sproboje sprawdzic to przy pomocy xdebuga i wykryc waskie gardlo ?
-------------------- Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota Zarządzaj swoim budżetem domowym |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 255 Pomógł: 5 Dołączył: 20.03.2007 Skąd: Kraków Ostrzeżenie: (30%) ![]() ![]() |
Nie wiem jak sie to robi w propelu, ale sprobujcie zrobic tak, zeby wypisalo wszystkie query_stringi jakie robi na bazie.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 211 Pomógł: 3 Dołączył: 29.07.2005 Skąd: Szczebrzeszyn Ostrzeżenie: (0%) ![]() ![]() |
@domis86 - przecież wypisałem wyżej - robi 2 zapytanie...
@Sh4dow - a możesz powiedzieć jak to sprawdzić? z xdebuga korzystał właściwie tylko jako z lepszego var_dump'a ![]() |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@Sh4dow - a możesz powiedzieć jak to sprawdzić? z xdebuga korzystał właściwie tylko jako z lepszego var_dump'a ![]() Może to coś pomoże: http://www.xdebug.org/docs/profiler -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Przyczyną na 90% będzie jedna z metod hydrate, która jest zaimplementowana w sposób nie do końca optymalny. Jakiś czas temu opublikowałem notę z poprawionym generatorem, który tworzy wydajniejszy kod, z racji na zastosowanie identity map.
-------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 211 Pomógł: 3 Dołączył: 29.07.2005 Skąd: Szczebrzeszyn Ostrzeżenie: (0%) ![]() ![]() |
ehh, teraz przypominam sobie ze niecały rok temu miałem sprawdzić ale przez nawał obowiązków kompletnie wyleciało mi to z głowy za co teraz przepraszam :/ ale mam też pytanie - czy integrowałeś swoją klasę z propelem zintegrowanym z symfony?
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 28.06.2025 - 20:59 |