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
Odpowiedz
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.
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. –
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
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
- 1. Funkcje Cloud for Firebase zabite z powodu przekroczenia limitu pamięci
- 2. php błąd limitu pamięci mpdf
- 3. Android ma mało pamięci, bez oczywistego powodu.
- 4. Jak uzyskać numer seryjny pamięci USB w języku C#
- 5. Błąd braku pamięci PHP, mimo że nie osiągnięto limitu pamięci
- 6. różnica między json_decode ($ var) a (object) json_decode ($ var, true)
- 7. Json_decode ze specjalnymi znakami
- 8. Przeciek pamięci w aplikacji WPF z powodu DelegateCommand
- 9. PHP json_decode pytanie
- 10. Konflikt seryjny Git
- 11. Błąd serwera IIS z powodu bieżącej pamięci całkowitej
- 12. Program Excel 2013 ulega awarii z powodu fragmentacji pamięci.
- 13. feedparser z limitu czasu
- 14. Jak ustawić numer seryjny NSOperationQueue?
- 15. Przekroczenie limitu pamięci w R (nawet przy 24 GB RAM)
- 16. Python: ustawianie limitu pamięci dla określonego wywołania funkcji
- 17. php Jak korzystać z wartości z tablicy json_decode?
- 18. Ustawianie limitu całkowitej pamięci fizycznej dostępnej w systemie Linux
- 19. Limit czasu impasu DB2 Sqlstate: 40001, kod przyczyny 68 z powodu instrukcji aktualizacji wywoływanych z apletu przy użyciu SQL
- 20. Zawieszenie z powodu Integer.parseInt
- 21. AVCaptureSession otrzymuje ostrzeżenie i awarię pamięci bez powodu
- 22. Jak programowo uzyskać numer seryjny iPhone'a?
- 23. Pobieranie id seryjny z partii wstawiony wierszy w PostgreSQL
- 24. Kod seryjny znacznie wolniejszy niż użycie tylko jednego wątku w C?
- 25. PHP json_decode na 32-bitowym serwerze
- 26. PHP Błąd krytyczny: wywołanie niezdefiniowanej funkcji json_decode()
- 27. C# Stream.Read z limitu czasu
- 28. PHP str_replace() z parametrem limitu?
- 29. bash kod błędu 137 vs 1, gdy z pamięci
- 30. Jak zmniejszyć wykorzystanie pamięci przez kod z pytonem?
Czy myślałeś o czymś takim 'ini_set ('memory_limit', '256M');'? – HamZa
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
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