Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Obrobka kolosalnego pliku
Forum PHP.pl > Forum > PHP
pieto
Witam,
Muszę wykonać dość ambitną operacje napliku .xml
a mianowicie plik.xml o romiarze 250Mb wprowadzić so SQL'a
nie wiem do konca jak za to sie zabrać, chodzi o to by sparsować jego zawartość do języka SQL, rekordy odzielone są przez tagi <page></page> ale mniejsza z tym bo wiem jak to zrobić mam problem tylko jak wczytac krok po kroku jego zawartość, najlepiej aby pobrał najpierw pierwszy <page>terefere bla bla bla</page> (nie ladowal calosci) - obrobil poczym chwycil nastepny.

są jakieś odpowidnie funkcje które się nadają się do takiej operacji ?

z góry dzieki za helpa i pozdrawiam
Ociu
simplexml_load_file
hwao
musisz tak... (w php mimo wsyztko nie polecam tego robic, ale jak nie znasz innych jezykow).

set_time_limit
  1. <?php
  2. ?>


w php ini ustawic musisz maxymalny rozmiar pamieci zajmowanej przez php na ponad plik czyli calkiem sporo smile.gif (w php ini tez mozesz ustaci ten time_limit na 0 - oznacz bez limitu).

Teraz zalezy jak wczytujesz ten plik, mozesz jako xml (to co napisal ociu) badz tez jako zwykly plik i parsowac samemu (polecam to co napisal ociu).

i ladujesz do bazy danych
FiDO
Oj slabo mu doradziliscie.. bardzo slabo winksmiley.jpg

simplexml jest pamieciozerny i nie poleca sie go do duzych xmli.. a 250MB to juz jest kawal pliku... simplexml w tym wypadku zarżnął by serwer. Zreszta nie.. bo memory_limit w php.ini by na to nie pozwolil.. a nawet jak go zwiekszyc to nie zapominajcie, ze 250MB plik XML wcale nie bedzie zajmowal w pamieci 250MB w postaci SimpleXML'a.. raczej duzo wiecej, wiec tego ramu mogloby czasem byc malo.

W przypadku takich duzych plikow to jedynie przetwarzanie strumieniowe wchodzi w gre, zatem: http://www.php.net/manual/en/ref.xml.php Niestety to chyba ta najmniej przyjemna metoda na przetwarzanie XML'a, ale dla tego rozmiaru pliku nie widze innej sensownej opcji.
hwao
Fido jak ma okolo 1gb ramu to bedzie najprostrzy sposob na zrobienie tego
sf
oczywiscie, ze to najlepiej zrobic poprzez php.net/xml jak pisal FiDO, nawet pliki 40 mb tak robilem... i wcale to nie jest takie skomplikowane, kaszka z mleczkiem dla kodera

przy okazji dodam, ze czesto sa ograniczenia na czas procesora skryptu php, wiec jesli nie mamy serwera dedykowanego to proponuje sie zastanowic nad perlem, ktory tak nie molestuje procesora winksmiley.jpg
FiDO
Cytat(hwao @ 2006-01-25 08:15:08)
Fido jak ma okolo 1gb ramu to bedzie najprostrzy sposob na zrobienie tego

Obawiam sie, ze jednak nie smile.gif

Zrobilem na szybko maly test.. skrypt po zaladowaniu XML'a o wielkosci 7MB przez SimpleXML'a zajmowal ok 48MB w pamieci. Niestety taka obiektowa reprezentacja jest dosc mocno nadmiarowa, wiec roznice miedzy miejscem na dysku, a tym w pamieci sa dosc konkretne. Jesli by to przeskalowac na plik 250MB to wyjdzie, ze potrzeba prawie 2GB ramu... jest co prawda swap, ale to juz troszke przymulic kompa.

Cytat
oczywiscie, ze to najlepiej zrobic poprzez php.net/xml jak pisal FiDO, nawet pliki 40 mb tak robilem... i wcale to nie jest takie skomplikowane, kaszka z mleczkiem dla kodera

Nie napisalem, ze skomplikowane.. ale nie jest tak proste jak SimpleXML. Trzeba troche innego podejscia, ale oczywiscie jest to jak najbardziej do zrobienia i nie jest to trudne.
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.