Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JSON] JSON_ERROR_UTF8 w dużym pliku
Forum PHP.pl > Forum > PHP
markuz
Witam,

Mam dość sporego JSON`a (172 MB) którego oczywiście chcę jakoś przeczytać, jednak json_decode() zwraca błąd nr. 5 - JSON_ERROR_UTF8 "Nieprawidłowe znaki UTF-8. Możliwe, że nieprawidłowo zakodowane". Większość edytorów pc/online gubi się przy tak dużym pliku (albo zżera mi ram i procesor, albo otwiera się np. w sublime text aczkolwiek poruszanie się po nim nie należy do przyjemnych - jedno przewinięcie kilka sekund i kolejne). W jaki inny sposób mogę zidentyfikować i poprawić ten błąd? Macie jakieś pomysły?

PS. dokładnie jest to geojson - ale struktura jest taka sama jak json.

Próbowałem z :
  1. $json = utf8_encode($json);
  2. $json = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($json));
  3. $json = mb_convert_encoding($json, "UTF-8", "auto");

jednak bez efektów.

Ed. 1
mb_detect_encoding zwraca UTF-8

Ed. 2
Podzieliłem go na 180 partów. Żeby łatwo wyłapać początek i koniec:

Początek - http://wklej.to/LtAQp
Koniec - http://wklej.to/d1zu4

Struktura wydaje się być w porządku - tylko ten problem z kodowaniem.

Ed. 3
Problem rozwiązany.

Ed. 4
Jednak problem dalej istnieje.
Główny problem to json_decode który przy pliku *.json ważącym 180 MB potrafi zeżreć kilka GB ram-u (lokalnie serwer padł przy 2 GB, drugi serwer zatrzymał się na 3.5 GB). Wiecie czemu tak jest?

Rozwiązaniem było stremowanie pliku *.json tak aby ograniczyć zużycie RAM`u.
Używałem tych dwóch bibliotek:
https://github.com/salsify/jsonstreamingparser
- Po ok. 30 minutach skrypt się wysypał z tym samym skutkiem (brak RAM`u).
https://github.com/kuma-giyomu/JSONParser
- Po ok. 10 minutach skrypt się wysypał "Terminated"

Spotkał się ktoś z Was kiedyś z takim problemem? Macie jakieś pomysły?

@up
pomoc nadal potrzebna, problem jednak nie jest rozwiązany a może ktoś coś podpowie smile.gif
Pyton_000
Możesz podać linka do calego JSON ?
markuz
JSON był konwertowany z pliku *.shp za pomocą ogr2ogr
Do pobrania: https://drive.google.com/file/d/0B_6i5mSFJC...iew?usp=sharing
Pyton_000
Możesz pobierać linijka po linijce za pomocą fgets i sprawdzaj czy linijka zaczyna się od
Kod
{ "type"

Jeżeli tak to przepuść ją przez json_decode

i tak aż Ci się skończy plik. Tylko musisz po przemieleniu paczki wywalać zmienne żeby Ci pamięć nie zapchała.
markuz
@Pyton_000 zrobiłem jak mówiłeś, problem się powtórzył gdy okazało się, że 1 linijka ma 1kk+ znaków. Napisałem to w python - działa szybko i bez zarzutów - kodu mniej. Wzrost zużycia RAM-u niezauważalny. Chyba pomyślę o pythonie na poważnie smile.gif
Pyton_000
Też się nad tym zastanawiałem czy Pythona nie ruszyć ale jakoś tak brak mi zapędów w tą stronę smile.gif
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.