Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> wydajność mysql i apache
dado
post
Post #1





Grupa: Zarejestrowani
Postów: 194
Pomógł: 2
Dołączył: 12.04.2004
Skąd: Częstochowa

Ostrzeżenie: (10%)
X----


Mam problem dość spory dotyczący granic możliwości przerobowych mysql i php.
Mam skrypt który ściąga dane w postaci xml i wrzuca je do bazy.
W czasie wykonywania skryptu parsuje on 6 plików xml (simplexml) o wadze 300mb każdy razem okoł 3 milionów rekordów które następnie wrzucam do bazy mysql. Jak dotąd

- skutecznie wieszam kompa lub
- dostaje komunikat o koncu limitu czasu wykonywania skryptu który wydłużam do 2700 sec.
- lub o czyms takim "Fatal error: Out of memory (allocated 702808064) (tried to allocate 16 bytes) "

(działa póki co na localhost amd64 3,4 ghz, 1gb ram, winXp). czy ktoś z was miał podobne projekty do realizacji ? i czy jest na to jakiś sposób w ramach php+mysql questionmark.gif

Ten post edytował dado 1.03.2007, 09:38:35
Go to the top of the page
+Quote Post
mhs
post
Post #2





Grupa: Zarejestrowani
Postów: 764
Pomógł: 3
Dołączył: 30.04.2003

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


Ja mam coś takiego jednak przy znacznie mniejszych danych. Tzn. plik xml ma około 23 mega następnie dodaje do bazy danych (ok. 100 tys. rekordów). Na lokalnym komputerze działa prawidłowo. Niestety na serwerze home.pl wywala bład o alokacji pamięci i nic się z tym nie da zrobić.

Pytanie:Może jest jakiś sposób na "sekwencyjne" wczytywanie xml'a?
Go to the top of the page
+Quote Post
Sh4dow
post
Post #3





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


Cytat(dado @ 1.03.2007, 09:32:28 ) *
...
W czasie wykonywania skryptu parsuje on 6 plików xml (simplexml) o wadze 300mb każdy razem okoł 3 milionów rekordów które następnie wrzucam do bazy mysql. Jak dotąd
...

to co zaznaczylem jest najwiekszym bledm, Simplexml z tego co wiem (mam nadzieje ze nie pomylilem sie) parsuje caly plik naraz metoda DOM. wiec taki plik bezproblemowo zapcha kazdy serwer. Proponuje uzyc parsowania SAX'em (Uzyj tego) i parsujac plik dodaj go do bazy. Tym sposobem paro GB pliki xml mozna ładowac do bazy i nic sie nie bedzie dzialo. To wina blednego zastosowania lub raczej rozwiązania.

Edit: zreszta temat chyba tutaj nie pasuje

Ten post edytował Sh4dow 1.03.2007, 14:03:48


--------------------
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
Go to the top of the page
+Quote Post
strife
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 605
Pomógł: 96
Dołączył: 22.10.2004
Skąd: UK

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


Przenoszę do XML, AJAX > XML


--------------------
Go to the top of the page
+Quote Post
splatch
post
Post #5





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Spróbuj składać zapytanie w postaci masowej. Zgaduję, że teraz jeden rekord = 1 insert. To potrafi zabić bazę danych. Składaj zapytanie o wielkości powiedzmy 10 tys rekordów i wysyłaj je od razu. Mówiąc 10 tys mam na myśli:
  1. INSERT INTO foo (bar, baz) VALUES
  2. (1, 2),
  3. (2, 2),
  4. (3, 2),
  5. (4, 2),
  6. // i tak dalej


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
Sh4dow
post
Post #6





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


Cytat(splatch @ 4.03.2007, 14:20:29 ) *
Spróbuj składać zapytanie w postaci masowej. Zgaduję, że teraz jeden rekord = 1 insert. To potrafi zabić bazę danych. Składaj zapytanie o wielkości powiedzmy 10 tys rekordów i wysyłaj je od razu. Mówiąc 10 tys mam na myśli:
  1. INSERT INTO foo (bar, baz) VALUES
  2. (1, 2),
  3. (2, 2),
  4. (3, 2),
  5. (4, 2),
  6. // i tak dalej

No tutaj to ja bym sie spieral czy to bedzie lepsze. Nie wiem czy mysql "łyknie" tak wielkie zapytanie. Nie jestem przekonany czy nie braknie mu ramu aby trzymac wszystkie dane jednoczesnie, po sparsowaniu pojedynczego rekordu jeden insert, niepodejzewam zeby mysql sie zatkał. A tak wogole błędem było
Cytat
Fatal error: Out of memory (allocated 702808064) (tried to allocate 16 bytes)

a nie problemy z mysqlem. Sam przerabiałem ten problem przy xml'ach wiec ja mowie z doswiadczenia. Rkingsmiley.png


--------------------
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
Go to the top of the page
+Quote Post
splatch
post
Post #7





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Cytat(Sh4dow @ 5.03.2007, 11:05:13 ) *
No tutaj to ja bym sie spieral czy to bedzie lepsze. Nie wiem czy mysql "łyknie" tak wielkie zapytanie. Nie jestem przekonany czy nie braknie mu ramu aby trzymac wszystkie dane jednoczesnie, po sparsowaniu pojedynczego rekordu jeden insert, niepodejzewam zeby mysql sie zatkał. A tak wogole błędem było
Cytat
Fatal error: Out of memory (allocated 702808064) (tried to allocate 16 bytes)

a nie problemy z mysqlem. Sam przerabiałem ten problem przy xml'ach wiec ja mowie z doswiadczenia. Rkingsmiley.png

Będę złośliwy, ale widocznie masz skromne doświadczenie skoro tak się tym obnosisz i piszesz takie banialuki. Z testów, które przeprowadzaliśmy w pracy wynikało jasno, że wielokrotny insert po prostu miażdżył.
Zapytanie wykonywane dla 2 kolumnowej tabelki, bez jakichkolwiek indeksów, ponieważ częstotliwość zmian w testowanej tabelce była bardzo wysoka.
Kod
Wstawienie 200 000 rekordów pojedynczymi zapytaniami:
PostgreSQL: 395sec
MSSQL: : 64sec
MySQL MyISAM: 33 s
MySQL InoDB: 468 s
MySQL Memory: 32 s

Wstawienie tej samej ilości rekordów insertem wielokrotnym:
PostgreSQL: 8 s
MySQL MyISAM: 8 s
MySQL InoDB: 11 s


Jako bonus, dodam, że COPY PostgreSQL zajmowało dla 200 000 rekordów zajmowało około 4 sekund..
Testy wykonywane przy pomocy biblioteki sqlapi.

Proszę Cię Sh4dow, poważnie się zastanów zanim poddasz wątpliwości moje słowa.


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
SongoQ
post
Post #8





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%)
-----


Czy przypadkiem COPY w PG nie ma jakis ograniczen? Chodzi mi o wielkosc danych


--------------------
Go to the top of the page
+Quote Post
Sh4dow
post
Post #9





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


@splatch, hmmm, jesli ma 3 miliony rekordow, wszystko pakowac do stringa no to ile bedzie wazyc zmienna z tym zapytaniem ?
Jesli blad jaki jest w temacie wyglada tak:
Fatal error: Out of memory (allocated 702808064) (tried to allocate 16 bytes)
Wiec jaki jest sens ładowac wszystko naraz i zyskiwac 30s, jesli parsowanie xmla bedzie zajmowac pare minut ? Nie chodzi o predkosc ale raczej o blad podany w temacie.


--------------------
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
Go to the top of the page
+Quote Post
splatch
post
Post #10





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Cytat(Sh4dow @ 12.03.2007, 15:45:48 ) *
@splatch, hmmm, jesli ma 3 miliony rekordow, wszystko pakowac do stringa no to ile bedzie wazyc zmienna z tym zapytaniem ?


Jeśli mam 30 milionów rekordów to szybciej będzie robić 30 milinów zapytań czy 300 000?


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
Sh4dow
post
Post #11





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


wiesz w sumie to mozna zrobic binda w mysqli.
A co do paczkowania ilosci zapytan to juz podejzewam jego sprawa jak cobie rozwiaze smile.gif


--------------------
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
Go to the top of the page
+Quote Post
mike
post
Post #12





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Sorki za OT'a:

~Sh4dow śledzę ten wątek od początku i muszę przyznać, że z każdym Twoim postem wątek coraz bardziej się nadaje na Humor.
Czy Ty zdajesz sobie sprawę jakie pierdoły gadasz?

Przecież każdy argument i wypowiedź ~splatcha kładzie na łopatki Twoje. A jednak się bezsensownie miotasz. Przecież dostałeś konkretne benchmarki.
Czy Ty w ogóle masz doświadczenie w tym temacie? Po tym co czytam: wątpię.

Jedyne co do czego masz rację to że lepiej parsować strumieniowo xml'a.

Proszę napisz coś jeszcze: bawisz mnie tongue.gif
Go to the top of the page
+Quote Post
Sh4dow
post
Post #13





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


Cytat(mike_mech @ 22.03.2007, 01:23:09 ) *
Proszę napisz coś jeszcze: bawisz mnie tongue.gif


Nie no oczywiscie ze mam zielonego pojescia a dla ciebie szczegolnie pisze cos zeby poprawic ci humor w taki szary dzien jak dzis
zgodze sie ze zapytanie bedzie sie wykonywac dluzej. Ale niepodejzewam zeby biblioteka w c++ odzwiercieglala zachowanie skryptu w php bardzo dokladnie

test pierwszy 100 rekordow 1 zapytanie sql
Kod
Memory Usage: 262144
Time: 0.04914s.
Iteracje: 100


100 rekordow 100 zapytanie sql
Kod
Memory Usage: 524288
Time: 0.0274s.
Iteracje: 100


drugi test 5000 rekordow 1 zapytanie
Kod
Memory Usage: 6291456
Time: 0.55521s.
Iteracje: 5000


5000 rekordo 5000 zapytan
Kod
Memory Usage: 262144
Time: 1.28052s.
Iteracje: 5000


trzeci test 10000 rekordo 1 zapytanie
Kod
Memory Usage: 12058624
Time: 1.09467s.
Iteracje: 10000


10000 rekordow 10000 zapytan sql
Kod
Memory Usage: 262144
Time: 2.83552s.
Iteracje: 10000


czwarty test 50000 rekordow 1 zapytanie
Kod
#1153: Got a packet bigger than 'max_allowed_packet' bytes
Memory Usage: 58195968
Time: 0.44581s.
Iteracje: 50000

zapytanie sie nie udalo

50000 rekordow 50000 zapytan sql
Kod
Memory Usage: 262144
Time: 14.05176s.
Iteracje: 50000


dla ostatniego testu byłem zmuszony zwiekszyc ilosc pamieci dla skryptu do 64 MB

Nie mowie ze sie nie zgadzam ze splatch'em. Ale podaje rozwiazanie na tyle optymalne ze nie ogranicza mnie wielkosc xml'a bedzie to dzialac dla 10 rekordow i dla 100 GB xml'a poprostu bedzie dłuzej sie wykonywac. Nie musze kombinowac i sprawdzac jak duze packi beda mi przechodzic. Jesli pojawi sie blad w zapytaniu, z jakiego kolwiek powodu. Powiedzmy ze chodzi o dane z xml'a to niezaladuje sie jedno zapytanie a nie cala paczka. Wszystko zalezy od tego jak krytyczny jest skrypt. Skrypt uzalezniasz od tego jak ma dzialac. Jesli administrator zmniejszy wartosc max_allowed_packet na serwerze mysqla to ? A no i jeszcze jedno, ja nie testowalem tego na tablicy gdzie sa dwa inty ale na 6 kolumnach gdzie 3 to int i 3 to varchar.

Podkreslam jeszcze raz, ze nie neguje tego co pisał splatch. Ja stwierdzam cos co zauwazylem kiedys pracujac z duzymi plikami xml ktore obslugiwalem przez php.


--------------------
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
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 22:03