2013-02-25 15 views
5

Mam duży plik json (7.3MB), który próbuję do json_decode i nie działa z powodu limitu pamięci (Błąd krytyczny: Dozwolony rozmiar pamięci wynoszący 134217728 bajtów wyczerpany). Czy istnieje sposób na zdekodowanie pliku json serialnie, z jednym obiektem/węzłem naraz?Seryjny kod json_decode z powodu limitu pamięci

+0

Czy myślałeś o czymś takim 'ini_set ('memory_limit', '256M');'? – HamZa

+0

W przypadku niestandardowego analizatora składni tak, json_decode odczyta cały ciąg znaków. Mimo to, jeśli chcesz zachować cały wynikowy obiekt w pamięci, możesz nie oszczędzać wystarczającej ilości pamięci. – datasage

+0

Zależy od struktury. Jeśli byłaby to tablica obiektów, wznowienie dekodowania na poziomie 1 byłoby trywialne w przypadku dowolnego analizatora składni. PEARs Services_Json lub upgradephp/json_decode z pewnością mogą zostać zaatakowane. Iteracyjne analizowanie struktur zagnieżdżonych jest bardziej uciążliwe ze względu na rekursywny sposób, w którym zwykle wykonywane są parsery JSON. – mario

Odpowiedz

0

Przypuszczam, że teoretycznie można napisać jakąś logikę, aby parsować znaki od początku i końca ciągu, iteracyjnie zmniejszając rozmiar łańcucha w pamięci podczas budowania reprezentacji obiektu/tablicy, ale byłby to poważny ból.

Dlaczego nie tylko zwiększyć limity pamięci, lub jeśli jest to jakiś JSON, który musi być często dekodowany (tj. Przy każdym żądaniu do aplikacji internetowej), należy rozważyć rozdzielenie go na więcej składników użytkowania.

+2

Jest to również bardziej teoretyczne pytanie, wiem, że mogę zwiększyć pamięć, ale co, jeśli rozmiar JSON wynosi 3 GB. Pytam, czy istnieje biblioteka, która zliczy wszystkie symbole {} i pozwoli mi uruchomić na przykład na poziomie 1, obiekt 999999, (bez względu na to, gdzie jest w pliku i ile hierarcy było przed) i dekodowanie rozpoczynające się od obiektu i/lub podobiektu w czasie. –

+0

Czy próbowałeś włączyć drugi parametr ('bool $ assoc = false') funkcji' json_decode'? Przechowuje json w prostej tablicy zamiast obiektu, która może zaoszczędzić trochę pamięci .. – MatRt

+0

Jeśli to nie wystarcza, myślę, że musisz napisać swój własny prosty parser (pokrywający twoje potrzeby, niekoniecznie bardzo skomplikowany JSON), ponieważ wydaje się, że nie ma implementacji PHP parsera SAX JSON – MatRt

Powiązane problemy