2012-08-29 11 views
5

Mam plik JSON o wielkości około 1 MB przechowywany w folderze zasobów, który muszę ładować w mojej aplikacji przy każdym uruchomieniu. Odkryłem, że wbudowany analizator składni JSON (org.json) bardzo wolno analizuje plik, jednak po jego przeanalizowaniu mogę bardzo szybko uzyskać dostęp do danych i nimi manipulować. Odliczałem aż 7 lub 8 sekund od momentu, w którym kliknę aplikację do momentu, w którym zostało wywołane Działanie1, ale tylko kilka milisekund, aby przejść z Czynności1 do Czynności2, która zależy od danych przetworzonych z danych wczytanych Działanie1.Parsowanie ~ 1 MB JSON na Androida bardzo powolny

Czytam plik do pamięci i analizowania go za pomocą:

String jsonString = readFileToMemory(myFilename) 
JSONArray array = new JSONArray(jsonString); 

gdzie readFileToMemory (String) wygląda następująco:

private String readFileToMemory(String filename) { 
    StringBuilder data = new StringBuilder();  
    BufferedReader reader = null; 
    try { 
     InputStream stream = myContext.getAssets().open(filename); 
     reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 
     int result = 0; 
     do 
     { 
      char[] chunk = new char[512]; 
      result = reader.read(chunk); 
      data.append(chunk); 
     } 
     while(result != -1); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return data.toString(); 
} 

Czy ktoś ma jakieś sugestie, jak mogę przyspieszyć do początkowego ładowania i parsowania danych? Czy powinienem maskować cały proces za ekranem ładowania?

+0

Istnieje mikro optymalizacje można uczynić , jak 'data.ensureCapacity (stream.available())' i tworzenie fragmentów 8K lub 64K, itp., ale tak naprawdę byłoby lepiej byłoby serializować dane lub zapisać je do tabeli SQL po parsowaniu, a następnie użyj tego, chyba że wykryjesz, że plik JSON został zaktualizowany. –

Odpowiedz

2

Powinieneś utworzyć tabelę SQLite do przechowywania danych i przenieść ją z JSON do SQL przy pierwszym uruchomieniu aplikacji. Dodatkową korzyścią jest to, że dane są łatwiejsze do przeszukiwania i umożliwiają modyfikowanie danych z poziomu aplikacji.

+0

Tak, spróbuj SQLite lub podziel JSON na małe. – neohope

8

JSONObject - ten z json.org, jest najprostszym interfejsem API do analizy składni JSON. Jednak jest wyposażony w koszt - performance. Przeprowadziłem rozległe eksperymenty z JSONObject, Gson i Jacksonem. Wydaje się, że bez względu na to, co zrobisz, JSONObject (a więc JSONArray) będzie najwolniejszy. Przejdź na Jackson lub Gson.

Oto względna wydajność z dwóch

(najszybsza) Jackson > Gson >> JSONObject (najwolniejszego)

Patrz:
- Jackson
- Gson

+0

Czy można używać Jacksona bez POJO? LIke Od tej chwili używam JSONObject, aby odczytywać z mojego pliku json jeden po drugim i tworzyć wstawki db - (No classes). Czy mogę używać Jackson'a w ten sam sposób, aby czytać obiekty Json/tablicę jeden po drugim i parsować, wstawiać db? –

+0

Tak. Przeczytaj tę dokumentację tutaj. http://fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/jackson/databind/ObjectMapper.html#readTree(java.lang.String) – Nishant

+0

Jackson link jest uszkodzony – VVB