Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JSON] JSON_ERROR_UTF8 w dużym pliku
markuz
post
Post #1





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


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

Ten post edytował markuz 16.02.2015, 17:49:54


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Możesz podać linka do calego JSON ?
Go to the top of the page
+Quote Post
markuz
post
Post #3





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


JSON był konwertowany z pliku *.shp za pomocą ogr2ogr
Do pobrania: https://drive.google.com/file/d/0B_6i5mSFJC...iew?usp=sharing


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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.
Go to the top of the page
+Quote Post
markuz
post
Post #5





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

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


@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

Ten post edytował markuz 19.02.2015, 15:24:59


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Też się nad tym zastanawiałem czy Pythona nie ruszyć ale jakoś tak brak mi zapędów w tą stronę smile.gif
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 - 06:25