Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> parsowanie i zapis 1,5GB pliku XML do mysql, jak to robić aby najmniej obciążać zasoby
aladin07
post 3.04.2009, 06:55:33
Post #1





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 22.07.2007

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


to rozwazania jeszcze czysto teoretyczne ale poki co probowalem temat rozgryzac na duzo mniejszym pliku

na razie - nie wiem czy dobrze to wszystko robie ale jesli nie to prosze mnie poprawic i nakierowac

uzywalem xmlreader(moze jednak lepszy bedzie sax bo widze ze wszedzie sie proponuje sax'a do tak duzych plikow)
dodam ze przyklad dotyczyl poki co pliku o wadze 7,5 Mb z 8357 rekordow
parsowanie takiego pliku z zapisem danych do tablicy zajmuje 1,434 sek. - duzo czy nie duzo?
nie wiem czy powinno sie to zapisywac wlasnie do tablicy (najpierw wszyskie dane)

robie to przy pomocy switcha w zaleznosci co sie znajdzie w xml'u
a nastepnie wartosc atrybutu przypisuje do zmiennej
i ta zmienna wrzucam do tablicy

$trip_date = $reader->getAttribute('date');
$tablica[$licznik]['trip_date'] = $trip_date;

nie wiem czy to jest dobry i efektywny sposob moze da sie jakos szybciej


pozniej wedlug sugestii buduje w petli jeden duzy insert zeby nie obciazac bazy danych
no ale wlasnie tutaj samo zbudowanie takiego duzego inserta zajmuje niemal 10 sekund a to wedlug mnie juz
tragicznie dlugo
robie to w petli
przy pojedynczych insertach nie jest szybciej a wrecz wolniej

zapisanie takiego zapytania do bazy to 0,1610 sek - tez w sumie nie wiem czy to duzo czy nie
ale jak wezme pod uwage ze przede mna bedzie codzienna aktualizacja danych z dobrych kilku GB
w tym takie kolosy jak 1,5GB plik to obawiam sie ze strasznie zamule vps'a 1,2GHz i 384 ramu
(taki jest w planie - na wiecej na razie nie ma funduszy a obecnie jeszcze jade na hostingu z ktorego na pewno
mnie admin wyprosi jak bede tak obciazal serwer biggrin.gif )




---------------------------------
pierwsze podejscie optymalizacyjne dla zbudowania inserta z 10000 wpisow
dalo dobre wyniki
utworzenie inserta trwa teraz dla 10tys. rekordow okolo 0,033 sek. a nie jak przedtem
nawet do 14 sek. - nie wiem dokladnie w czym byl problem
ale obecnie petla budujaca zmienna przekazywana do zapytania wyglada
nastepujaco

  1. <?php
  2. $zapytanie = 'INSERT INTO car (trip_date,trip_period,trip_catalog,trip_template,trip_id) VALUES (''.$tablica[1]['trip_date'].'',''.$tablica[1]['trip_period'].'',''.$tablica[1]['trip_catalog'].'',''.$tablica[1]['trip_template'].'',''.$tablica[1]['trip_id'].'')';
  3.  
  4. for ($i=1;$i<10000;$i++)
  5. {
  6.  
  7.      $zapytanie .=',(''.$tablica[$i]['trip_date'].'',''.$tablica[$i]['trip_period'].'',''.$tablica[$i]['trip_catalog'].'',''.$tablica[$i]['trip_template'].'',''.    $tablica[$i]['trip_id'].'')';
  8.  
  9. }
  10. ?>


takze teraz najbardziej waskim gardlem pozostaje dalej samo parsowanie bo czas tworzenia samego inserta jak
i przetwarzanie przez baze jest na calkiem przyzwoitym poziomie - tak mi sie przynajmniej wydaje
w takim tempie dodanie 1 mln rekordow powinno zajac okolo 20 sek.
a to juz chyba nie jest tragedia

dla 20tys. rekordow na raz zrobienie inserta i wpisanie do bazy to okolo 0,31 sek.
dla 50tys. mamy okolo 0,75 sek.
przy 100tys. widac juz tendencje wzrostowa czasu czyli nie mamy tutaj wielkiego zysku
czas potrzebny waha mi sie juz w granicach 1,9-3,3 sek. wiec
trzeba bedzie to sobie jeszcze wymyslic ile na raz warto wpisywac
zeby jeszcze skrocic czas wpisywania

Ten post edytował aladin07 3.04.2009, 10:03:18
Go to the top of the page
+Quote Post
maly_swd
post 1.06.2009, 22:27:56
Post #2





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


Kolega przetwarza pliki Merlinowe?smile.gif

Ten post edytował maly_swd 1.06.2009, 22:28:27


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
erix
post 2.06.2009, 09:56:26
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
parsowanie takiego pliku z zapisem danych do tablicy zajmuje 1,434 sek. - duzo czy nie duzo?
nie wiem czy powinno sie to zapisywac wlasnie do tablicy (najpierw wszyskie dane)

Niby nie. Ale bez sensu tak do tablicy. tongue.gif

Masz coś takiego, jak XML Reader w PHP; przetwarza dane strumieniowo.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
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 Wersja Lo-Fi Aktualny czas: 19.07.2025 - 06:54