![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 29.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam, od pewnego czasu borykam się z pewnym problemem.
Opiekuję się serwisem, który codziennie wymaga aktualizacji bazy danych poprzez import kilku plików XML do bazy danych (MYSQL). Pliki są wielkośći kilkunastu bądź kilkudziesięciu MB. W celu sprawnego importu dziele je na mniejsze porcje rzędu 1MB a nastepnie importuje pokoleji. Baza danych zawierająca oferty składa się kilku tabel w ktorych liczba rekordow wacha sie od kilkunastu tysiecy do 1,5 mln rekordow. W kazdej tabeli jest zdefiniowanych po kilka indeksów (w celu sprawnego dzialania wyszukiwarki w ktorej niezbedne jest łączenie kilku tabel poprzez JOIN) jednak podczas importu (innstrukcji INSERT , UPDATE), koniecznosc aktualizacji indeksow sprawia ze trwa on o wiele dluzej i przez 3-4 godz serwis staje sie praktycznie nie dostepny dla uzytkownikow. Chodzi o to ze na tabele zapewne nakladane sa blokady podczas wykonywania instrukcji INSERT oraz UPDATE. Serwis praktycznie zamiera poniewaz nie moze korzystac z tych tabel. Ma ktos moze pomysl jak rozdzielic dostep do zasobow , tak aby import oraz serwis dzialal sprawnie? Serwis jest typu http://travelplanet.pl i mysle ze posiada podobna ilosc ofert (to tak dla zobrazowania z czym mam doczynienia...). |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 1 595 Pomógł: 282 Dołączył: 24.09.2007 Skąd: Reda, Pomorskie. Ostrzeżenie: (0%) ![]() ![]() |
spokojnie to przemyśl...
jeżeli wysilisz się, i napiszesz (nawet niezbyt wydajne) skrypty w PHP (lub innym narzędziu) które na podstawie danych w XML wygenerują odpowiednie pliki CSV - oddzielny plik dla każdej aktualizowanej tabeli... to wtedy możesz (też w PHP lub innym języku) pętlą przelecieć się po tych tabelkach i zrobić te kilka / kilkanaście LOAD DATA INFILE w odpowiedniej kolejności, żeby nie naruszyć integralności danych w bazie... a jaka z tego wszystkiego korzyść ? w czasie, kiedy serwer PHP będzie sobie mielił te pliki (XML -> CSV) masz zapewniony normalny dostęp userów do bazy - bo baza w ogóle nie będzie obciążona... za to sam proces aktualizacji danych bazie skróci się znacząco (przy tych ilościach danych o których piszesz nie powinien przekraczać kilku - kilunastu minut)... wiem, że nie jest to łatwe rozwiązanie, ale nie widzę innej prostej możliwości - może znajdzie się i wypowie ktoś bardziej doświadczony... możesz wybrać jeszcze inną drogę- poszatkuj te dane na małe porcje (kilka - kilkanaście rekordów) i aktualizuj wstawiając przerwę 2-3 sekundy miedzy kolejnymi porcjami. co prawda cały proces ci się znacznie wydłuży (byle zmieścić się w 24 h) ale za to w międzyczasie userzy będa mieli swobodny dostęp do bazy... |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 29.06.2007 Ostrzeżenie: (0%) ![]() ![]() |
spokojnie to przemyśl... jeżeli wysilisz się, i napiszesz (nawet niezbyt wydajne) skrypty w PHP (lub innym narzędziu) które na podstawie danych w XML wygenerują odpowiednie pliki CSV - oddzielny plik dla każdej aktualizowanej tabeli... to wtedy możesz (też w PHP lub innym języku) pętlą przelecieć się po tych tabelkach i zrobić te kilka / kilkanaście LOAD DATA INFILE w odpowiedniej kolejności, żeby nie naruszyć integralności danych w bazie... a jaka z tego wszystkiego korzyść ? w czasie, kiedy serwer PHP będzie sobie mielił te pliki (XML -> CSV) masz zapewniony normalny dostęp userów do bazy - bo baza w ogóle nie będzie obciążona... za to sam proces aktualizacji danych bazie skróci się znacząco (przy tych ilościach danych o których piszesz nie powinien przekraczać kilku - kilunastu minut)... wiem, że nie jest to łatwe rozwiązanie, ale nie widzę innej prostej możliwości - może znajdzie się i wypowie ktoś bardziej doświadczony... jak nie znajde innego rozwiazania problemu faktycznie trzeba bedzie sie nad tym zastanowic możesz wybrać jeszcze inną drogę- poszatkuj te dane na małe porcje (kilka - kilkanaście rekordów) i aktualizuj wstawiając przerwę 2-3 sekundy miedzy kolejnymi porcjami. co prawda cały proces ci się znacznie wydłuży (byle zmieścić się w 24 h) ale za to w międzyczasie userzy będa mieli swobodny dostęp do bazy... Wlasnie takie rozwiazanie jest zastosowane jednak nie zdaje ono zabardzo egzaminu, musialy by byc naprawde bardzo male porcje a wowczas ten import trwal by caly dzien albo i dluzej.... A pliki z aktualnymi ofertami sa codziennie nowe @sardpal - a ten proces importu masz całkowicie zautomatyzowany? Dokładnie chodzi o pobieranie danych z merlina (czyli zipa); jego rozpakowanie i późniejsze sparsowanie xml'a i wrzucenie danych do bazy danych? nie jest calkowicie zautomatyzowany. Klient wgrywa sobie pliki a z crona odpalam skrypty, ktore dziela pliki na male kawalki i dla kazdego kawalka jest odpalany import po koleji Ja wszystko co mam całkowicie zautomatyzowane, ale niestety ponieważ strona stoi hostingu współdzielonym mam problem z tym, że już przy samym rozpakowaniu pliku skrypt alokuje zbyt dużo pamięci serwera i jest lipa z tym. Niestety muszę proces aktualizacji odpalać z innej maszyny. tez mialem ten problem dlatego zastosowalem rozwiazanie o ktorym wyzej napisalem |
|
|
![]() ![]() |
![]() |
Aktualny czas: 10.10.2025 - 16:31 |