lechu80
20.02.2008, 09:51:37
Witam wszystkich!
To moj pierwszy post na jakimkolwiek forum poswieconym programowaniu, bo do tej pory dobrze sobie radzilem sam z google ;-)
Ale nadszedl taki moment i potrzebuje rady, bardziej doswiadczonych osob...
Tworze system (php, xml, mysql) dla firmy, ktora jest posrednikiem ofert -> dane sa wczytywane skryptem z roznych adresow www w postaci plikow xml (uzywam do tego biblioteki curl), a nastepnie za pomoca simplexml wczytywalem ten plik i skladalem w petli w zapytanie insert do lokalnej bazy mysql (aby wszystkie oferty byly w jednym miejscu, latwiej w systemie sie wyszukuje).
Problem polega na tym, ze pliki xml maja od 10 do 300MB wielkosci:
1) dla plikow do 100MB trwa to dlugo (zwiekszylem wartosc max_execution_time, zeby w ogole skrypt mogl dzialac) - moze da sie szybciej? Jesli tak, to moze jakies rady?
2) dla plikow powyzej 100MB - simplexml w ogole sie zacina i po wprowadzeniu do bazy ok 1000 rekordow, przestaje dzialac -> macie jakeis pomysly? przejrzalem forum, niektorzy proponuja bibioteke SAX - czy ktos probowal tego w jakims podobnym systemie do mojego? czy poza tym jest jakies inne rozwiazanie?
Z gory dzieki za pomoc!
Leszek
smialy
20.02.2008, 11:21:35
Spore te pliki XML. Chyba troche za duże jak na PHP. Całe ładować do pamięci - nie bardzo. Z tego co wiem to nawet ezPublish miał w którejś wersji 128 mega potrzebne na uruchomienie :/ Ale to nie 300 :]
Skoro to XML wiec powinno dać się wczytywać framgentami w którym można będzie znaleźć właściwą gałąź i wstawić do bazy, Powtarzać sekwencję wczytywania fragmentu i wstawiania, aż do końca pliku. :/
lechu80
24.02.2008, 16:50:52
Jakos poradzilem sobie z tym problemem, ale jeszcze wydajnosc nie jest zadawalajaca...
Przede wszystkim zamiast simplexml_load_file(), ktore nie radzi sobie z plikami powyzej 70-80MB, uzylem fopen i fread do przeczytania pliku xml, a nastepnie przeanalizowalem plik xml poprzez xml_parser_create(). Udalo mie sie w ten sposob czytac pliki do 250MB (wczesniej ustawilem set_time_limit i ini_set('memory_limit') na odpowiednio duze wartosci), a czas przetwarzania zmniejszyc 3-5 krotnie (obecnie moge zapisac 72 tys. rekordow na godzine do bazy, wczesniej uzyskiwalem 15-25 tys na godzine).
Ale nie wiem czy to w ogole ma sens isc ta droga - moze ktos zna jakies inne rozwiazanie, ktore da przyzwoite rezultaty?
Z gory dzieki za pomoc!
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.