Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: XML i out of memory
Forum PHP.pl > Forum > XML, AJAX > XML
robus
Cześć, mam plik XML, z którego chciałbym zczytać dane do zmiennej tablicowej $this->stack, ponieważ plik ma około 30MB wykrzacza się (Out of memory). Rozważałem już czytanie pliku po części żeby nie obciążąć pamięci niestety ten sam efekt. Zależy mi jednak żeby dane mieć w jednej zmiennej, ponieważ później całość porównywana jest z danymi znajdującymi się w bazie.

  1. function startElement($parser, $name, $attrs) {
  2.   $this->stack = array();
  3.    $tag=array("name"=>$name,"attrs"=>$attrs);
  4.    array_push($this->stack,$tag);
  5.  }
  6.  
  7.  function dataElement($parser, $data) {
  8.  if(trim($data)) {
  9.       $this->stack[count($this->stack)-1]['data']=$data;
  10.    }
  11.  }
  12. function endElement($parser, $name) {
  13.  $this->stack[count($this->stack)-2]['children'][] = $this->stack[count($this->stack)-1];
  14.   array_pop($this->stack);
  15.  }


Wykorzystanie zmiennej $this->stack:

  1. <?php
  2. for($j=0; $j<sizeof($this->stack[0][children][1][children]); $j++) {
  3. $a = $this->stack[0][children][1][children][$j][attrs][a];
  4. $ab = $this->stack[0][children][1][children][$j][attrs][ab];
  5. $zap = "SELECT COUNT(*) FROM test WHERE ab = '$ab'";
  6. $test = mysql_query($zap);
  7. $result = mysql_fetch_row($test);
  8. if($result[0] == 0) {
  9. $zapytanie = "INSERT INTO test (a_id, ab, a)
  10. VALUES (null, '$ab', '$a')";
  11. $out = iconv("UTF-8","ISO-8859-2", $zapytanie);
  12. mysql_query($out) or die(mysql_error());
  13. echo $j+1 .". Dodano pozycje $a ($a)<br/>";
  14. } else {
  15. echo $j+1 .".Pozycja $a ($a) już istnieje<br/>";
  16. }
  17. }
  18. ?>


Myślałem też o podziale pliku na kilka mniejszych jednak w tym przypadku nie specjalnie wiem jak sie za to zabrać.

Może wie ktoś w jaki sposób rozwiązać taki problem? Sugestie mile widziane.
Pozdr.
sf
Porównuj od razu te dane z tym co jest w bazie, w tablicy trzymaj tylko informację o tym czy zostały zapisane czy nie.. lub jakieś inne dane, które będą Ci potrzebne bo jeśli zapisujesz do tablicy prawie całą zawartość xml to nie da rady po prostu by to serwer przełkną bez zwiększenia ilości pamięci na wykonywanie skryptu.
robus
Dzięki sf za sugestie, faktycznie plik o wielkości 30MB leci bez problemu. Pozdr.
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.