2017-08-08 141 views
-1

我想解析來自OSM服務器的json文件。它可能從幾Kbs到10-20 Mbs不等。我現在正在使用GSON,但在解析大文件時(例如10 Mbs),我正面臨一些性能問題。僅在流模式下解析大約需要10秒鐘:Java解析大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(); 
    } 

現在它是我的應用程序的瓶頸。我已經嘗試了一些其他的圖書館,但沒有任何改善。有什麼我做錯了嗎?還是有一些特殊的方法來解析大型JSON數據?

+0

也許你想告訴我們你想達到的目標。可能有更好的方法可用。在JS中解析原始OSM數據聽起來不對。 – scai

+0

這是Java而不是JS。我想在給定的區域獲得OSM的路徑類型和其他一些基本數據。 – KamCho

回答

2

JSON不適用於快速解析(並且不是通常爲OSM提供的文件類型)。也許你應該看看OSM PBF。雖然它被壓縮,但解析速度應該比JSON快。

或者,不要重新發明輪子,而應使用諸如osmiumosmosis之類的工具來解析OSM PBF或XML。

另一種解決方案是爲您感興趣的確切元素類型創建一個Overpass API請求。這樣做的好處是您要解析的文件僅包含相關數據。

+0

我正在使用Overpass API只獲取有趣的數據。感謝您提供有關PBF格式的信息。這可能是一個解決方案。 – KamCho