AnsweredAssumed Answered

Out of Memory Errors during Merge

Question asked by mtippin on Jul 21, 2020
Latest reply on Aug 10, 2020 by Hornbydd

I've built a console app using ArcObjects 10.8 to manipulate shapefiles in various ways. One of the tasks is to combine groups of shapefiles into a single shapefile, so I'm using the Merge operation. 

 

What I'm finding is that, no matter how I try to manage the lifetime of the COM objects created by the ArcObjects SDK calls, the memory footprint only grows larger and larger on each subsquent Merge execution until the application eventually falls over with an OutOfMemory exception.

 

Can anyone explain the *correct* way to manage memory when calling the ArcObjects SDK methods? 

 

My code looks roughly like so (but I call the `Merge()` method dozens of times with different parameters)  - apologies for the formatting...

using System;
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.DataManagementTools;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geoprocessor;

namespace DesktopConsoleApplication1
{
class Program
{
private static readonly LicenseInitializer m_AOLicenseInitializer = new LicenseInitializer();

[STAThread()]
static void Main(string[] args)
{
     if (!m_AOLicenseInitializer.InitializeApplication(new[] { esriLicenseProductCode.esriLicenseProductCodeStandard }, new esriLicenseExtensionCode[] { }))
     {
       throw new Exception("ArcObjects License Initialization Failed");
     }
     MergeShapefiles(new[] { "file1.shp", "file2.shp", "file3.shp" }, "outputFile.shp");
}

private static void MergeShapefiles(string[] inputFiles, string outputFile)
{
    object sev = null;
    using (var releaser = new ComReleaser())
    {
      var gp1 = new Geoprocessor
      {
         OverwriteOutput = true,
      };

      releaser.ManageLifetime(gp1);

      var processor = new Merge(string.Join(";", inputFiles), outputFile);
      releaser.ManageLifetime(processor);

      var result = gp1.Execute(processor, null);
      releaser.ManageLifetime(result);

      var successMessages = gp1.GetMessages(ref sev);
   }
}
}
}

 

 

Outcomes