mam 2 pliki jeden z tymi samymi danymi i do wczytywania XML używam
https://github.com/prewk/xml-string-streamer
a Json
https://github.com/pcrov/JsonReader
i okazuje się, że wczytywanie Json trwa x100 wolniej ;(
sprawdzałem xdebug profilerem (o ile to dobrze zrobiłem) to za wolne działanie odpowiada ta class JsonReader.
Mój kod. Co robię nie tak ;(
$reader = new JsonReader(); $reader->stream($stream); /* * Wczytywanie obiektu * $record - pojedyńczy record najwyższego poziomu w json * $tree - przechowuje zagnieżdżenie elementu w strukturze, indeksy poszczególnych rekordów. * $tmp - tablica do której zapisujemy dany poziom struktury rekordu json * $depth - level na którym sa itemy; */ $record = []; $tree = []; $tmp = &$record; $depth = 1; /* * Wczytywanie elementów json, zakonczyć gdy otrzymamy pełny jeden wpis. * $record ma mieć formę tablicy asocjacyjnej. */ while ($reader->read()) { switch ($reader->type()) { /* * Początek obiektu lub tablicy */ case JsonReader::OBJECT : /* * Jeżeli mamy pusty index to okręślamy go na podstawie ostatniego zapisanego elementu w $tree */ if ($reader->depth() > $depth) { } else { $tree[] = $reader->name(); $tmp = &$tmp[$reader->name()]; } $tmp = []; } break; /* * Koniec obiektu lub tablicy */ case JsonReader::END_OBJECT : case JsonReader::END_ARRAY : /* * Jeżeli obiekt lub tablica się zakończyli musimy wrócić do wcześniejszego * elementu w strukturze */ if ($reader->depth() > $depth) { $tmp = &$record; foreach ($tree as $item) { $tmp = &$tmp[$item]; } } } elseif ($reader->depth() == $depth) { dump($tmp); $record = []; $tmp = &$record; } break; /* * Pojedynczy element */ default : /* * Jeżeli indeks jest pusty (np. ["a", 1, "b", 2]) * dodajemy element przez array_push * w przeciwnym razie * dołączamy nowy wpis przez array_merge */ if ($reader->depth() > $depth) { } else { } } } } $reader->close();
Witam

czy ja zle zadaje pytania? bo moje tematy zawsze bez odpowiedzi

Czego używacie do wczytywania dużych (~200MB ) plików JSON
