Changeset 1278 in josm


Ignore:
Timestamp:
Jan 17, 2009 3:12:46 PM (4 years ago)
Author:
ulfl
Message:

Cache the way ids in a HashMap for much better performance or relation preparation

add some console output for the current read progress

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/OsmReader.java

    r1254 r1278  
    77import java.io.InputStream; 
    88import java.io.InputStreamReader; 
     9import java.io.FileInputStream; 
     10import java.nio.channels.FileChannel; 
    911import java.util.ArrayList; 
    1012import java.util.Arrays; 
     
    5052public class OsmReader { 
    5153 
     54     static long tagsN = 0; 
     55     static long nodesN = 0; 
     56     static long waysN = 0; 
     57     static long relationsN = 0; 
     58     static long membersN = 0; 
     59 
     60     static InputStream currSource; 
     61 
    5262     /** 
    5363      * This is used as (readonly) source for finding missing references when not transferred in the 
     
    133143          private OsmPrimitive current; 
    134144          private String generator; 
    135  
     145          int n = 0; 
     146           
    136147          @Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 
    137148               try { 
     149                    if(n%100000 == 0) { 
     150                        try { 
     151                            FileInputStream fis = (FileInputStream)currSource; 
     152                            FileChannel channel = fis.getChannel(); 
     153                            double perc = (((double)channel.position()) / ((double)channel.size()) * 100.0); 
     154                            System.out.format(" " + (int)perc + "%%"); 
     155                        } 
     156                        catch(IOException e) { 
     157                            System.out.format("Error reading file position " + e); 
     158                        } 
     159                    } 
     160                    n++;                     
     161 
    138162                    if (qName.equals("osm")) { 
    139163                         if (atts == null) 
     
    187211 
    188212                    } else if (qName.equals("node")) { 
     213                         nodesN++; 
    189214                         current = new Node(new LatLon(getDouble(atts, "lat"), getDouble(atts, "lon"))); 
    190215                         readCommon(atts, current); 
    191216                         nodes.put(current.id, (Node)current); 
    192217                    } else if (qName.equals("way")) { 
     218                         waysN++; 
    193219                         current = new OsmPrimitiveData(); 
    194220                         readCommon(atts, current); 
     
    206232 
    207233                    } else if (qName.equals("relation")) { 
     234                         relationsN++; 
    208235                         current = new OsmPrimitiveData(); 
    209236                         readCommon(atts, current); 
    210237                         relations.put((OsmPrimitiveData)current, new LinkedList<RelationMemberData>()); 
    211238                    } else if (qName.equals("member")) { 
     239                         membersN++; 
    212240                         Collection<RelationMemberData> list = relations.get(current); 
    213241                         if (list == null) 
     
    227255 
    228256                    } else if (qName.equals("tag")) { 
     257                         tagsN++; 
    229258                         current.put(atts.getValue("k"), atts.getValue("v")); 
    230259                    } 
     
    365394      */ 
    366395     private Way findWay(long id) { 
    367           for (Way wy : ds.ways) 
    368                if (wy.id == id) 
    369                     return wy; 
    370396          for (Way wy : Main.ds.ways) 
    371397               if (wy.id == id) 
     
    407433          } 
    408434 
     435          // Cache the ways here for much better search performance 
     436          HashMap hm = new HashMap(10000); 
     437          for (Way wy : ds.ways) 
     438            hm.put(wy.id, wy); 
     439           
    409440          // pass 2 - sort out members 
    410441          for (Entry<OsmPrimitiveData, Collection<RelationMemberData>> e : relations.entrySet()) { 
     
    421452                         } 
    422453                    } else if (emd.type.equals("way")) { 
    423                          em.member = findWay(emd.id); 
     454                         em.member = (OsmPrimitive)hm.get(emd.id); 
     455                         if (em.member == null) 
     456                            em.member = findWay(emd.id); 
    424457                         if (em.member == null) { 
    425458                              em.member = new Way(emd.id); 
     
    438471               } 
    439472          } 
     473          hm = null; 
    440474     } 
    441475 
     
    454488          osm.references = ref == null ? new DataSet() : ref; 
    455489 
     490           
     491          currSource = source; 
     492           
    456493          // phase 1: Parse nodes and read in raw ways 
    457494          InputSource inputSource = new InputSource(new InputStreamReader(source, "UTF-8")); 
     
    463500        } 
    464501 
    465         if (pleaseWaitDlg != null) { 
    466                pleaseWaitDlg.progress.setValue(0); 
    467                pleaseWaitDlg.currentAction.setText(tr("Preparing data...")); 
    468           } 
     502          System.out.println(""); 
     503          System.out.println("Parser finished: Tags " + tagsN + " Nodes " + nodesN + " Ways " + waysN +  
     504            " Relations " + relationsN + " Members " + membersN); 
    469505 
    470506          for (Node n : osm.nodes.values()) 
     
    484520                    o.id = 0; 
    485521 
     522          System.out.println("File loaded!"); 
     523           
    486524          return osm; 
    487525     } 
Note: See TracChangeset for help on using the changeset viewer.