2017-08-08 3 views
-1

Ich möchte JSON-Datei von OSM-Servern analysieren. Es kann von wenigen Kbs zu 10-20 Mbs variieren. Ich verwende gerade GSON, aber ich habe einige Performance-Probleme, wenn große Dateien (wie 10 MB) analysiert werden. Es dauert etwa 10 Sekunden nur für im Streaming-Modus-Analyse:Java Parsing große JSON

JsonReader reader = new JsonReader(new StringReader(data)); 
    try { 
     reader.beginObject(); 
     while(reader.hasNext()){ 
      String name = reader.nextName(); 
      if(name.equals("elements")){ 
       reader.beginArray(); 
       while(reader.hasNext()){ 
        String type = null; 
        Long id = 0L; 
        Double lat = 0D; 
        Double lon = 0D; 
        ArrayList<Long> nodes = new ArrayList<>(); 
        Tags tags = null; 
        reader.beginObject(); 
        while(reader.hasNext()) { 
         name = reader.nextName(); 
         switch (name) { 
          case "type": 
           type = reader.nextString(); 
           break; 
          case "tags": 
           reader.beginObject(); 
           while (reader.hasNext()) { 
            name = reader.nextName(); 
            if (name.equals("highway")) 
             tags = new Tags(reader.nextString()); 
            else 
             reader.skipValue(); 
           } 
           reader.endObject(); 
           break; 
          default: 
           reader.skipValue(); 
           break; 
         } 
        } 
        reader.endObject(); 
       } 
       reader.endArray(); 
      } 
      else{ 
       reader.skipValue(); 
      } 
     } 
     reader.endObject(); 
     reader.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Für jetzt ist es ein Engpass für meine Anwendung ist. Ich habe schon einige andere Bibliotheken ausprobiert, aber es gab keine Verbesserung. Gibt es irgendetwas, was ich falsch mache oder gibt es eine spezielle Möglichkeit, große json-Daten zu parsen?

+0

Vielleicht möchten Sie uns sagen, was Sie erreichen möchten. Es könnte bessere Möglichkeiten geben. Das Parsen roher OSM-Daten in JS klingt falsch. – scai

+0

Es ist Java nicht JS. Ich möchte Arten und einige andere grundlegende Daten von OSM in gegebenem Bereich bekommen. – KamCho

Antwort

2

JSON ist nicht für schnelles Parsen gedacht (und ist keiner der Dateitypen, die normalerweise für OSM angeboten werden). Vielleicht sollten Sie sich stattdessen OSM PBF ansehen. Obwohl es komprimiert ist, sollte es schneller zu analysieren sein als JSON.

Alternativ können Sie das Rad nicht neu erfinden, sondern stattdessen ein Werkzeug wie osmium oder osmosis zum Parsen von OSM PBF oder XML verwenden.

Eine andere Lösung besteht darin, eine Overpass API Anfrage für die genauen Elementtypen zu erstellen, die Sie interessieren. Dies hat den Vorteil, dass die zu analysierende Datei nur relevante Daten enthält.

+0

Ich benutze die Overpass-API, um nur interessante Daten zu erhalten. Vielen Dank für Informationen zum PBF-Format. Es kann eine Lösung sein. – KamCho