2017-08-08 128 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