ThinkGeo.com    |     Documentation    |     Premium Support

Out of Memory Exception

Hi ThinkGeo Team


I have encountered the following problem after deploying my web application in the web server. When two connections occur concurrently in the web server an out of memory exception is thrown. And it seems the exception originates from generating cache images. See the attached screen shot image.


Best regards,


Vincent



OutOfMemory.JPG (57.8 KB)

Hi Vincent, 
 Yes, just as you guessed, it occurs from getting tiff image content.  Is it possible to let us know the size of the image? Can you have a try that changing the LibraryType of GeoTiffRasterLayer to “UnmanagedLibTiff”? 
  
 Thanks, 
 Johnny 


Hi Johnny


Thank you for the reply. There are 4 tiff files with a total size of 181MB combined.


Best Regards,


Vincent



Hi Vincent,



We don’t have such big tiff files to recreate your issue, sorry for the inconvenience. But here is a sample that uses unmanaged tiff library so that you can directly replace using your files to test the performance. On the other hand, if your file is public; please send us so that we can easily recreate your issue.



Thanks,

Howard



Post8557.zip (6.42 KB)

Hi Howard


Thank you for the reply. I have tried to implement your suggestion but I am still facing the same problem. When there is no collission of more than one request in the web server, everything is working fine. But when two connections raise a request for the image, then the out of memory exception fires.


My application that uses Map Suite web edition is mult-user and therefore, one of the requirement is to be able to serve as many users as possible at a time. Can you find for me a work around to this problem? Below is a sample code showing how I have been doing it.


 
GeoTiffRasterLayer Layera = new GeoTiffRasterLayer(TiffImage);
Layera.LibraryType = GeoTiffLibraryType.UnmanagedLibTiff;
Layera.UpperThreshold = double.MaxValue;           
Layera.LowerThreshold = 0;
Layera.IsGrayscale = false;

LayerOverlay dynamicOverlay = new LayerOverlay();
dynamicOverlay.IsBaseOverlay = false;
dynamicOverlay.Name = "Image";
dynamicOverlay.TileType = TileType.MultipleTile;
dynamicOverlay.Layers.Add(Layera);
Map1.CustomOverlays.Add(dynamicOverlay);
dynamicOverlay.ServerCache = new ServerCache(@"c:\GISImageCache\temp\img1");
dynamicOverlay.GenerateCacheImages(Map1.ClientZoomLevelScales[9], Map1.CurrentExtent, Map1.MapUnit);

Best Regards,


Vincent



Hi Vincent,



I double checked your code and exception; I found it's weird to throw this exception depending on your code. From your code; it should throw "The process cannot access the file * because it is being used by another process."; because you allow the cache generating by different users. Actually, you only need one user to raise the method to generate the cache files at server side; once the operation is running, the other users won't raise this operation anymore. So I modify your code a little to fix this conflict. Please have a try.



Monitor.Enter(Application);
if (Application["Caching"] == null)
{
    Application["Caching"] = new Object();
    ThreadStart threadStart = new ThreadStart(() =>
    {
        tiffOverlay.GenerateCacheImages(Map1.ClientZoomLevelScales[9], Map1.CurrentExtent, Map1.MapUnit);
    });
    Thread newThread = new Thread(threadStart);
    newThread.Start();
}
Monitor.Exit(Application);



Thanks,

Howard