![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 194 Pomógł: 2 Dołączył: 12.04.2004 Skąd: Częstochowa Ostrzeżenie: (10%) ![]() ![]() |
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 (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) Ten post edytował dado 1.03.2007, 09:38:35 |
|
|
![]() |
![]()
Post
#2
|
|
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:
|
|
|
![]() ![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 569 Pomógł: 0 Dołączył: 17.08.2003 Skąd: Dąbrowa Górnicza 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:
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. (IMG:http://forum.php.pl/style_emoticons/default/Rkingsmiley.png) |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
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. (IMG:http://forum.php.pl/style_emoticons/default/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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 10.10.2025 - 13:11 |