ThinkGeo.com    |     Documentation    |     Premium Support

Speed up routing time

I want to speed up the route time. The biggest problem is when the first route is made. It does a lot of IO before showing a route, that takes almost 1 min. If I do the same route again, the time is about 1s. The routes made after the first one are a lot faster.


So my question is how to solve that? Maybe it's loading the .RTG index in the first time that takes so long. If so, how can I preload that information?


Gustavo



Gustavo, 
  
   We are about to release a change that will allow you to cache the entire index file in memory for faster access times.  I will update here when it is ready. 
  
 David

Is there a date to this update be released? 
 I’m really concerned about it. 
  
 Gustavo

Gustavo, 
  
   Currently it is available through the daily builds however with some of the changes we have been making we introduced a few issue.  I would wait a few days and then get the daily development build.  You can always ask here in two days or so and we will let you know if it is ready. 
  
 David

I’ve just gotten the last daily development build and I didn’t see any improvement concerning the routing performance.

Gustavo, 
  
   I think the reason is that we have a new routing index format and you may not have used that.  It is currently not officially released so we do not have documentation or samples in place.  We will create some sample code and post it here.  If you want to move forward before I will give you a rough outline.   
  
 Get Data Ready: 
  
 1. Call the ERtgRoutingSource.GenerateRoutableShapeFile to create a rout-able shapefile.  This step modifies the shape file to make it more proper for routing.   
 2. Call the ERtgRoutingSource.GenerateRoutingData and pass in the FeatureSource that points to the rout-able shapefile you generated.  This will create your .ertg and .ertx indexes. 
  
 The completes the getting you data ready. 
  
 Using the index: 
  
 1. Create your routing source but use the ERtgRoutingSource 
 2. For the shapefile FeatureSource use the routable shapefile you created in step 1 above. 
 3. You can optionally pin the entire routing source in memory.  To do this I need to send a separate sample. 
 4. You can also optionally return different results.  If you want to know the distance only you can use the RoutingResultsType property on the RoutingSource.  In this way you can specify what you want returned.  Some people only want the distance or time and in that way they can save allot of time using the property. 
 5. If you want maximum performance make sure to use the A* algorithm. 
 6. It is also suggested that you do not use decimal degree maps.  We suggest you project your data to an accurate meters or feet projection to get better and faster routes. 
  
 David 


I followed the steps above and I could see a slightly improvement on the performance.  
 Routing the same route twice, the first route takes a lot more time than the second. 
 The very first route (the first time that I run the app) takes even more (I think it’s due to more initial IO, and after that some files get cached by the SO). 
 The ideal would be to have the routing time of the second route - when routing the same route twice.

 Gustavo,


 
  Here is how you can pin the routing index into memory.  This will speed things up and you will get consistent speeds over many routes.  Otherwise we cannot control the disk speed or caching by the hard drive or OS.
 
Here when you setup the routing source you also need to hook the stream loading event as well.  When we go to get the actual file stream we will raise the event.  In the event as you can see below you will load the file into a memory stream and pass it back to us.  In this way we will use the memory stream instead of us creating a file stream.  I suggest you place a break point in the event to make sure you are using the in memory stream.  If we do not get the stream in the event we will use the file stream internally.
 



        ERtgRoutingSource routingSource = new ERtgRoutingSource(@"C:\sample.ertg");
        routingSource.StreamLoading += new EventHandler<StreamLoadingEventArgs>(ERtgForm1_StreamLoading);

        void ERtgForm1_StreamLoading(object sender, ThinkGeo.MapSuite.Routing.StreamLoadingEventArgs e)
        {            
            if (e.AlternateStreamName.ToUpperInvariant() == ".ERTG")
            {
                MemoryStream streams = new MemoryStream(File.ReadAllBytes(@"C:\sample.ertg"));
                e.AlternateStream = streams;
            }
            if (e.AlternateStreamName.ToUpperInvariant() == ".ERTX")
            {                                                                                
                    MemoryStream streams = new MemoryStream(File.ReadAllBytes(@"C:\sample.ertx"));
                    e.AlternateStream = streams;
            }
        }




David

I’m getting better results now David. I’m happy that you have put the StreamLoading event on the ERtgRoutingSource in this version that you are building up, that made a notable difference. 
  
 How is the ERtgRoutingSource development going? Is it finished up now and trustful? The route speed got better? 
  
 Have a great day

Gustavo, 
  
   I think it is solid now.  The only question will be if we integrate the new source format into the older class.  Meaning the old class will be backward compatible with the old format and will also use the new format.  The format will not change but maybe we will use the old class.  Other that that the speed is much better in the new format especially using the stream loading.  Also if you only need time and distance without the route then we made speed improvements there also. 
  
 David