Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> XML i out of memory, zapis do jednej zmiennej
robus
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 8.03.2005

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


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
sf
post
Post #2





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

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


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.


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
robus
post
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 8.03.2005

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


Dzięki sf za sugestie, faktycznie plik o wielkości 30MB leci bez problemu. Pozdr.
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: 20.08.2025 - 01:05