Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Import dużego pliku XML
Forum PHP.pl > Forum > PHP
nexis
Posiadam cennik w formacie XML o rozmiarze ok. 26 MB (dla zainteresowanych umieszczam go tymczasowo TUTAJ).

Na serwerze pamięc tymczasowa jest ustawiona na 128 MB, więc pobranie tego pliku z zewnętrznego serwera działa bez problemu.

Problem pojawia się jednak przy jego odczycie i wykonywaniu operacji na podstawie odczytanych informacji, a ściślej mówiąc w tym kodzie:

  1. <?php
  2. require '../config.php';
  3.  
  4. mysql_query('TRUNCATE TABLE categories') or die(mysql_error());
  5.  
  6. $file = "cennik.xml";
  7. $fp  = fopen($file, "r");
  8. $data = fread($fp, filesize($file));
  9. fclose($fp);
  10.  
  11. $xml_parser = xml_parser_create();
  12. xml_parse_into_struct($xml_parser, $data, $vals);
  13. xml_parser_free($xml_parser);
  14.  
  15. $super = '';
  16.  
  17. foreach ($vals as $array) {
  18. switch ($array['tag']) {
  19. case 'GRUPAGLOWNA':
  20. if ($array['type'] == 'open') {
  21. mysql_query ("INSERT INTO categories VALUES ('" . $array['attributes']['ID'] . "', '', '" . $array['attributes']['NAZWA'] . "');") or die (mysql_error());
  22. $super = $array['attributes']['ID'];
  23. }
  24. break;
  25. case 'PODGRUPA':
  26. if ($array['type'] == 'complete') {
  27. mysql_query ("INSERT INTO categories VALUES ('" . $array['attributes']['ID'] . "', '" . $super . "', '" . $array['attributes']['NAZWA'] . "');") or die (mysql_error());
  28. }
  29. break;
  30. }
  31. }
  32.  
  33. ?>


Co kończy się błędem:

  1. Fatal error: Out of memory (allocated 43515904) (tried to allocate 32 bytes) in /internal/parser.php on line 16


Kiedy powyższy skrypt uruchamiam dla małej części pliku cennika, to wszystko działa. Więc pytanie mam takie: czy da się jakoś rozbudować powyższy skrypt, aby poradził sobie z takim plikiem czy też jest jakiś inny sposób (np. rozbicie dużego pliku na kilka mniejszych)?
Cezar708
braku pamięci nie pokonasz musisz podzielić ten plik na kilka mniejszych, lub wymyślić inny pomysł na import danych (jakby nie patrzeć XML jest dość ciężki)
mike
Najszybszym parserem w PHP jest XMLReader. Zastosuj jego właśnie.
Ale jak napisał ~Cezar708, jest granica wydajności i będziesz musiał albo dzielić plik albo przydzielić skryptowi więcej pamięci.
sf
Wystarczy ładować po kawałku ten xml.. nie wgrywać na raz i będzie wszystko ok. Testowane przy xml o wielkości 300MB. Przykład jak to zrealizować na php.net/xml
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.