Ignore:
Timestamp:
2009-01-17T15:12:46+01:00 (15 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.