Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: parsowanie i zapis 1,5GB pliku XML do mysql
Forum PHP.pl > Forum > XML, AJAX > XML
aladin07
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
maly_swd
Kolega przetwarza pliki Merlinowe?smile.gif
erix
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.