ThinkGeo.com    |     Documentation    |     Premium Support

Screen Resolution 1920x1080 - Insufficient memory Exception

MapSuite Support Team,



When my application runs full screen under a screen resolution of 1920x1080 an ‘insufficient memory’ exception is encountered.  Below is the full exception and appears to show that the exception is within the MapSuite code.



The exception occurs as a result of drawing a rectangle during MouseDown event of the TrackOverlay.  The exception does not occur within the TrackOverlay MouseDown Event code.



The exception does not occur for screen resolutions that are smaller, for example, 1280x800, 1280x1024.  When running on a 1920x1080 resolution if the application is sized smaller the exception is not encountered.  It is the horizontal width that is causing the exception.  If the application width is sized smaller the exception does not occur.  I do not know the maximum width for the exception not to occur.



The image that is attached shows that a rectangle of a small size can be drawn before the exception occurs.



Would appreciate if you would investigate.



Regards,

Dennis





ViewOfChicago->CurrentDomain_UnhandledException: 

Unhandled Exception–>Outer 

Source=PresentationCore 

TargetSite=Void FinalizeCreation() 

StackTrace= at System.Windows.Media.Imaging.RenderTargetBitmap.FinalizeCreation() 

at System.Windows.Media.Imaging.RenderTargetBitmap…ctor(Int32 pixelWidth, Int32 pixelHeight, Double dpiX, Double dpiY, PixelFormat pixelFormat) 

at nhQ=.XBg=.DrawCore(MapArguments mapArguments, Action`1 drawCoreAction) 

at ThinkGeo.MapSuite.WpfDesktopEdition.InteractiveOverlay.DxU=(LayerTile EBU=) 

at ThinkGeo.MapSuite.WpfDesktopEdition.TrackInteractiveOverlay.DrawCore(RectangleShape targetExtent, OverlayRefreshType overlayRefreshType) 

at ThinkGeo.MapSuite.WpfDesktopEdition.Overlay.Draw(RectangleShape targetExtent, OverlayRefreshType refreshType) 

at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.SxQ=(InteractiveResult TBQ=, InteractiveOverlay TRQ=) 

at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.VhQ=(InteractionArguments VxQ=) 

at ThinkGeo.MapSuite.WpfDesktopEdition.WpfMap.UxQ=(Object VBQ=, MouseEventArgs VRQ=) 

at nhQ=.WBk=.OnMouseMove(Object sender, MouseEventArgs e) 

at System.Windows.Input.MouseEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 

at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 

at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 

at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 

at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 

at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) 

at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) 

at System.Windows.Input.InputManager.ProcessStagingArea() 

at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) 

at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) 

at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) 

at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 

at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 

at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 

at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 

at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 

at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 

at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 

at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 

at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 

at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 

at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 

at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 

at System.Windows.Forms.Application.Run(Form mainForm) 

at ViewOfChicago.Program.Main() in C:\OemcProjectsCSharp\ViewOfChicago\Program.cs:line 54 

Message=Insufficient memory to continue the execution of the program.






Hi Dennis,



I created an application with size 1920x1080 under 1920x1080 resolution, but can’t recreate the exception, would you please try the attach sample to see if it can recreate in your end or is there anything I am missing?



Waiting for your further information.

Regards,

Troy

11999.zip (99 KB)

Hi Dennis,



I created an application with size 1920x1080 under 1920x1080 resolution, but can’t recreate the exception, would you please try the attach sample to see if it can recreate in your end or is there anything I am missing?



Waiting for your further information.

Regards,

Troy

11999.zip (99 KB)

Troy,



I looked at your sample application, but it does not make use of the ‘TrackInteractiveOverlay’.  It appears to me the problem is somewhere in the WpfMap TrackOverlay code.  Please incorporate TrackOverlay and let me know what you see.



Thanks,

Dennis






Hi Dennis, 
  
 We haven’t got enough information from the stack information, and you can add  
  
 wpfMap1.TrackOverlay.TrackMode = TrackMode.Rectangle; 
  
 before  
  
 wpfMap1.Refresh(); 
  
 in Troy’s sample to try to recreated that. 
  
 I haven’t succeed reproduce this problem local. 
  
 My environment is win 7 English, vs 2010 with dot net framework 4.0. 
  
 If you found you can reproduced that in this sample please let us know. 
  
 And maybe you can did some change in the sample for help us locate this exception. 
  
 Regards, 
  
 Don

Don,



I’ve added the TrackOverlay to your example, but also have not been able to reproduce the exception with your example.  Of course there is more going on in my application so I am going to be adding more code to your sample.



The environment is Win-7, 64-bit, VS 2010, .NET V4.0



My application has 65 shape file layers and 16 MrSid’s.  So what I am going to do is remove all but one layer from my application and see if mine continues to encounter the exception.



I’ll let you know what I find.



Dennis


Dennis, 
  
 Any update please let us know. 
  
 We will also did more try to reproduce that. 
  
 Regards, 
  
 Don

Don,



Recall that my application uses 65 shape file layers and 16 MrSids.  What I did was to not load the MrSids.  Without the MrSids I am able to draw a larger rectangle that when the MrSids are loaded.  Compare the picture below with my original picture and you’ll see that the rectangle from the TrackOverlay is larger.



When all but a few layers are removed the exception does not occur unless I zoom out to almost the full extent then the exception is encountered.



Seems like this has to do with the number of layers and how far out the zoom level is.



The Stack Trace from the Exception shows that it is in the TrackInteractiveOverlay when the exception occurs.  So what is that code doing on a per layer basis?



Another thing I’ve always noticed is that the CPU usage for my application at times can go to 25% by simply drawing a rectangle using TrackOverlay…why does it take 25% of the CPU to simply draw a rectangle?



I’ve added additional code to DisplayASimpleMap, but am unable to get the exception to occur.  The layers in my application only cover the city of Chicago where yours covers all of North America so that may be why your application does not encounter the exception.



Since the exception is an out-of-memory exception it seems to say that something is being accumulated as the rectangle gets larger and it is doing this on a per layer basis.



Just some observations on my part…what do you think?



Regards,

Dennis









hi Don,



Was wondering if you have any update for me on this?



Regards,

Dennis


Hi Dennis, 
  
 Sorry reply you so late, your problem a little complex because it looks only occur in some special environment. In my test environment, I still cannot reproduced that. 
  
 I am not sure whether there is a memory leak here because for render special images like ecw or mrsid we call 3rd part dll which built by C or C++. At the same time our extension developer is focus on new release, so he don’t have time for research this problem deeper. 
  
 I think we will research that after new 8.0. 
  
 For now, could you please have more test for get useful information about it? Whether it will be thrown in a better machine? Could we did some optimize for render mrsid so that reduce memory usage in one extent? 
  
 For your question about memory usage when draw rectangle, I think that’s because we did some operation in mouse-move event, I will double check that for make sure it don’t takes unnecessary memory. 
  
 Regards, 
  
 Don

Don,


I continue to have issues with this out-of-memory exception.  I am trying to bring this into production and am unable because of this exception so this is getting to be very important for me.


I believe that this is a memory issue – either a leak, but more likely inefficient use of memory such that when there are many layers there is not enough memory to process the TrackOverlay during a mouse-move.  Remember that my application has 65 Shape File and 16 MrSid layers.


Recall what I had previously pointed out about how much CPU power it takes to simply draw a rectangle using TrackOverlay.  It can vary from 25-40% and can cause memory usage to spike to over 1GB.


I have discovered that the further out I zoom the more likely this exception is to occur.


I reverted to V7.0.0.234 of the MapSuite dll’s and the exception occurs but not nearly as often as under V7.0.0.320.  So some changes between these two releases certainly exacerbated the condition.


I can never get this memory exception to occur under a resolution of 1280x1024.


The machine has the following characteristics:

Dell Precision R7610

Process            Intel(R) Xeon(R) CPU E5-2603 0 @ 1.80GHz 1.80 GHz

4 core

Memory 8.00GB

System 64-Bit, Windows 7 Professional


The exception will also occur on the following machine, but less often:

Dell Latitude E6410

Processor Intel® Core™ i7 CPU M 640 @ 2.80GHz 2.80 GHz

4 core

Memory 4.00GB

System 64- Bit, Windows 7 Professional



Do you have any insights into this issue?



Regards,

Dennis



Hi Dennis,



I think I have recreate this issue in my end with the below codes under resolution 1920x1080:


private void WpfMap_Loaded(object sender, RoutedEventArgs e)
        {
            wpfMap1.MapUnit = GeographyUnit.DecimalDegree;
            wpfMap1.CurrentExtent = new RectangleShape(-163.4, 41.9, -60.1, 30.3);
            wpfMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
 
            for (int i = 0; i < 16; i++)
            {
                MrSidRasterLayer sidImageLayer = new MrSidRasterLayer(@"…\Data\world.sid");
                sidImageLayer.UpperThreshold = double.MaxValue;
                sidImageLayer.LowerThreshold = 0;
 
                LayerOverlay staticOverlay = new LayerOverlay();
                staticOverlay.Layers.Add(“SidImageLayer”, sidImageLayer);
                wpfMap1.Overlays.Add(staticOverlay);
            }
            for (int i = 0; i < 70; i++)
            {
                ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"…\Data\USStates.shp");
                worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
                worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
 
                LayerOverlay staticOverlay = new LayerOverlay();
                staticOverlay.TileType = TileType.SingleTile;
                staticOverlay.Layers.Add(“WorldLayer”, worldLayer);
                wpfMap1.Overlays.Add(staticOverlay);
            }
            wpfMap1.TrackOverlay.TrackMode = TrackMode.Rectangle;
            wpfMap1.Refresh();
        }

My environment is below:


CPU: i7 3.4GHz

RAM: 16G

OS:win8 x64

Resolution-highest: 1920*1080

Resolution-recommended:1680*1050



I google the error stack and seems this is a hotfix from Microsoft. Here is a temporary solution based on a KB article:

 support.microsoft.com/kb/2494124 . I hope this hot fix will fix this issue.





Also, I will continue to investigate the CPU high usage reason and if any updates I will update here.

Thanks,

Troy

Troy,



I received Hotfix KB2494124 from Microsoft.  The attempted install fails with “KB2494124 does not apply, or is blocked by another condition on your computer”.  Receive same error on both my development and target machines.  I have a case open with Microsoft to determine the exact reason why this hotfix will not install.



Have you been able to install this hotfix?



This Hotfix appears to be at least 3+ years old and I would not be surprised if it is already included in current .NET 4 releases and patches.



Since this is a memory issue and the fact that drawing a rectangle with TrackOverlay uses exorbitant amounts of memory I’d have to say that the TrackOverlay is a bit suspicious…  What is your opinion?



Have you been able to resolve the CPU and memory usage issues?



Regards,

Dennis


Hi Dennis, 
  
 I think you are right that the KB is obsolete as I am also encountering the same issue like yours. Now I am returning to do the investigates on TrackOverlay and I am guessing if any crimes in it to result both of the exception and the CPU usage issue. 
  
 Sorry for any inconvenience and I will update here if any progresses. 
 Troy

Troy,



Thanks for the update.



Dennis


Hi Dennis,


The TrackInteractiveOverlay is not per layer basis,  one map object just has only one instance, I
think the biggest problem comes from the big data loaded into map, thus, big
memory is consumed. The reason why the exception is thrown from the
TrackInteractiveOverlay is determined by the sequence of loading overlays into
map control, just as you mentioned, after all overlays have been loaded, it has
consumed lots of memory, when creating new memory for drawing the shape on the
map, it may run into “Out-of-Memory” exception.


After I dig into further, I guess a possible reason is that
you may load all layers (65 shape files + 16 Mrsid files) into different
Overlays, in other words, creating 81 overlays with 81 layers for 81 files, in
that case, with SingleTile, we will need to create more than 81 very big image
in the memory, with MultiTile, I guess more images will be created in the
memory. I tried the code provided by Troy with 40 Mrsid file (Size is bigger
than 400MB), we can recreate your problem on my end, while if we use MultiTile,
and just create 2 Overlays to load these files (one Overlay for Mrsid and
another for Shape file), everything works fine, and memory is stable.  I’m not sure whether it fits your
requirements, any questions please let me know.


Thanks,


Johnny



Johnny,



My application uses one Overlay for the MrSid’s (MultipleTile), three Overlays for the shape files (MultipleTile), and sixteen Overlays for InMemoryFeatureLayer(HybridTile).



One thing I don’t understand with TrackOverlay is that why is it attempting to create an image?  I just wanted to draw a rectangle and then do a spatial query of the features within that rectangle.  In other cases I use it to set the current extent to the drawn rectangle.



Is there another MapSuite object that I can use to achieve my goal?



Regards,

Dennis






Hi Dennis, 
  
 Sorry that I misunderstood you on TrackOverlay, strictly speaking, it’s not attempting to create an image, instead, creating a RenderTargetBitmap to provide an element to draw the shapes.  Can you let me know what size of all these Mrsid are, and the size of all shape files, also please let me know how many big shapes loaded into the InMemoryFeatureLayer? Is it possible to provide us a demo to recreate the problem you have experienced, I think that will be helpful for us to resolve the problem, if your data is protected, please just let us know that size of these data, we can try creating by ourselves. 
  
 P.s. we will take more time to dig into further before waiting your materials, any finding will be posted here as well. 
  
 Thanks, 
 Johnny

hi Johnny,



I’m wondering why it is creating a RenderTargetBitmap, what’s the purpose of creating that when the only thing being drawn is a rectangle?  What shapes are you referring to that are going to be drawn?  I’m only using the TrackOverlay to get a rectangle.



The TrackOverlay has a number of properties that I am simply taking the default on, in fact the only one I set is

TrackMode.  I set the events for MapMouseUp, MapMouseDown, TrackStarted, MouseMoved, & TrackEnded.



Is there any TrackOverlay property that should be set specifically?



Also be aware that all layers are not always Visible, they are loaded, but not Visible.  If all layers, except for one, are made Invisible the exception still occurs.  So if a layer is not currently visible is TrackOverlay still creating a RenderTargetBitmap for said layer?



There are 19 MrSid’s that total 11GB, 65 shape files that total 1GB, and 9 InMemoryFeature Layers that have at most a total of 1,000 features.  The InMemoryFeatureLayer’s are points only.  I don’t believe the InMemoryFeatureLayer’s have any impact on this as the exception occurs whether or not these layers have any features.



In terms of providing a demo are you looking for my …\Debug directory of modules so that you can execute my application?  I would have to ask if I would be permitted to provide you the MrSid’s and Shapefiles.



Appreciate your help.

Dennis



Hi Dennis, 



The RenderTargetBitmap is just a container for drawing shapes, for example, when you are drawing a rectangle, which will be hosted by the created RenderTargetBitmap. To optimize the memory of TrackInteractiveOverlay to avoid the memory pike, please try setting:  wpfMap1.GCCollectionMode = GCCollectionMode.Forced; Also, please make the property “LockLayerMode” of all LayerOverlay created as “LockLayerMode.Lock” to have a try. 



In terms of providing a demo, I means “Can you share the code of loading the map layers to us? or abstract these codes to a simple separated project to help us recreate the issue?”, if providing MrSid and ShapeFiles is not permitted, I think just the code is ok as well. 



Actually, It’s weird that we are unable to recreate the issue mentioned here when we are loading more than 25 GB Mrsid files in one Overlays with MultiTile, the memory is stable as well, so it’s better you guys can share your codes of loading the files. 



Btw, if the demo is too big, please contact support@thinkgeo.com for a FTP address, or you can send it to forumsupport@thinkgeo.com.



Thanks, 

Johnny