ThinkGeo.com    |     Documentation    |     Premium Support

ShapeFileFeatureLayer.Open

Hi,


I've been doing a lot of performance profiling on my app recently.  We have a lot of shapefiles we display, and when the data is not cached, the load times were unusably slow.  Doing some profiling, I found that 42% of the time was spent in Layer.Open(), and I also found that it was being opened and closed every time the layer was drawn.  I overrode ShapeFileFeatureLayer to always keep the layer open and found that I got something like 600% performance gain.


My question is, what if any side affects will I see from keeping the layer open.  This is just base map data and will never be changed or queried.


 


Thanks,


.Ryan.



Ryan, 
  
 Thanks for your information, I just curious that how do you override ShapeFileFeatureLayer to always keep the layer open, could you provide the code to us? I think it will help us optimize MapSuite to make performance better. 
 The side effect is that the memory usage is very high, if the total shp files’ size is large enough, it will throw Out Of Memory exception. 
  
 Thanks, 
 James 


Hi James, 
 Thanks for your response.  I’ve run my application for a while and have watched the memory and it seems to remain constant (it may go up 100k, but the GC runs and it drops back down)… this is the same behavior that I was seeing before my change, so I’m not seeing the high memory usage.  The following is my code that I use: 
  
 
    public class MyShapeFileFeatureLayer : ShapeFileFeatureLayer
    {
        public MyShapeFileFeatureLayer(string x)
            : base(x)
        {

        }

        public MyShapeFileFeatureLayer(string x, string y)
            : base(x, y)
        {

        }

        private bool opened = false;

        protected override void OpenCore()
        {
            if (!opened)
            {
                base.OpenCore();
                opened = true;
            }
        }

        protected override void CloseCore()
        {
            // Do nothing
            //base.CloseCore();
        }
    }
 


Ryan, 
  
 I think there are two reasons you get that result.  
 1, your shape file is not big enough 
 2, you only load that shape file for one time, you can try to add map to a content control, add content control to main form to show map, and then remove it, and repeat again, you will see the memory usage higher and higher. 
  
 I think we should dispose the resource after we don’t use it, now we put those code in layer.CloseCore, if you do nothing to override the code, it will make resource couldn’t be disposed. 
  
 Thanks, 
  
 James