![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 65 Pomógł: 4 Dołączył: 6.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Hej,
Co prawda aplikacja jest napisana w C (z wykorzystaniem MySQL API) a nie w PHP, ale problem tkwi po stronie MySQL-a stad pisze tutaj a nie na forum C/C++. Program ktory napisalem, ma wrzucac informacje z przeparsowanego pliku tekstowego do bazy danych, problem polega tylko na tym, ze tych danych jest sporo (stad wybralem C a nie PHP). Sprobowalem wrzucic dane tylko z 1 pliku co daje ~ 3487 zapytan do bazy danych i program wykonywal sie przez prawie 3 minuty! Co przy ponad 500 plikach daje wiecznosc (IMG:style_emoticons/default/wink.gif) . No ale pomyslalem, ze moze jest to wina braku optymalizacji programu, wiec postanowilem napisac cos takiego:
gdzie tabela to:
Kod pisalem z pamieci (nie mam teraz dostepu do zrodla programu) wiec moga gdzies byc byki, ale chcialem przekazac tylko sens. Okazalo sie, ze przedstawiony wyzej kod tez wykonuje sie w granicach 3 minut ;/. Mieliscie kiedys podobna sytuacje? Dlaczego tak sie dzieje? Jak to naprawic? Dziekuje za wszelka pomoc, pozdrawiam MD |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
skoro rekordów jest dużo, ale widzę są one krótkie to jednym zapytaniem wkładaj np po 10 rekordów
....values (rekord1), (rekord2), (rekord10) Wiecej info masz w dokumentacji http://dev.mysql.com/doc/refman/5.5/en/insert.html Będzie zdecydowanie szybciej |
|
|
![]()
Post
#3
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Możesz również opakować grupę opreacji insert w transakcje.
|
|
|
![]()
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żliwe, że spowalniaczem są:
a) operacje odczytu plików z dysku, (IMG:style_emoticons/default/cool.gif) ciągłe nawiązywanie nowych połączeń zamiast używanie jednego przez cały czas skryptu, c) niezbyt wydajne parsowanie zawartości. Trudno cokolwiek powiedzieć bez jakiejś faktycznej próbki kodu i tego jak wygląda obróbka plików do formy zapytań. Pamiętaj, że operacje I/O sa zawsze wąskim gardłem i to one głównie spowalniają aplikację. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 65 Pomógł: 4 Dołączył: 6.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
@nospor && @wookieb -> sprobuje (IMG:style_emoticons/default/wink.gif)
@thek Ad.1 byc moze, ale malo prawdopodobne bo wszystkie pliki maja ~ 40MB (a jest ich nieco ponad 500) Ad.2 nawiazuje tylko 1 polaczenie przez caly czas pracy programu Ad.3 nie, bo zrobilem tak, jak to napisalem w 1 poscie zeby to sprawdzic ---------------------------------------------------------------------------------------- EDIT 2011.06.09 10:17 Zmodyfikowalem wczoraj kod i zaimplementowalem tranzakcje -- 10 000 zapytan poszlo w 1.5s, gdzie wczesniej przypominam ~3500 zapytan wrzucalo sie do bazy w 3 minuty (IMG:style_emoticons/default/wink.gif) Dzieki! A teraz kolejne pytanie ... skoro puszczam kilka insertow na raz, w takim razie w jaki sposob moge wyznaczyc maxymalny limit zapytan w trakcie jednej tranzakcji? Przy takim kodzie jaki zaprezentowalem w pierwszym poscie (tylko z wykananiem zapytania PRZED petla "START TRANSACTION" i ZA petla "COMMIT") wczoraj i 100 000 zapytan poszlo w 14s, ale co gdy zapytanie jest bardziej udziwnione? Jak mozna to "wyliczyc"? Przypuszczam, ze ma tutaj znaczenie zmienna max_allowed_packet (w my.conf -- u mnie standardowo 16M), no ale jak wyliczyc ile zapytan da te 16M? Pozdrawiam MD Ten post edytował MiChaSSs 9.06.2011, 09:17:26 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 207 Pomógł: 18 Dołączył: 4.09.2010 Skąd: warszawa Ostrzeżenie: (0%) ![]() ![]() |
zabierasz się za to od złej strony.
manual mysql, szukaj składni LOAD DATA LOCAL INFILE 'xxx' INTO TABLE wraz z opcjami |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.09.2025 - 18:38 |