Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Import dużego pliku XML
nexis
post
Post #1





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

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


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)?


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
Cezar708
post
Post #2





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


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)
Go to the top of the page
+Quote Post
mike
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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.
Go to the top of the page
+Quote Post
sf
post
Post #4





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


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


--------------------
Zapraszam na mój php blog, tworzenie stron.
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 Aktualny czas: 21.08.2025 - 00:28