4 Replies Latest reply on Mar 21, 2014 12:28 PM by mattd

    Performance of ArcFM Layers in ArcGIS Server

    Doug Krohn

      We are using ArcGIS 9.3.1 SP2 and ArcFM 9.3.2 with ArcFMized Objects and have a Python script to create FGDBs of our enterprise data.

      These FGDBs are consumed by an ArcGIS 10.2 Server to create Map Services.  We have installed the ArcFM Object Reader 10.2.1 and the data is displaying fine.  The issue is when we analyze the performance of the created Map Services, the ArcFMized layers return  a High Severity warning that the 'Layer is being published with custom feature' (see accompanying picture).  So the questions we have are

      1. Exactly how much of a performance hit will these ArcFM Layers be when we have a significant amount of users accessing the Map services – we are expecting in the 100's.
      2. Is there any way to modify the Python script to de-ArcFMize the ArcFM objects once they get exported to the FGDB?  We haven't found any Python tools in 9.3 or even 10.2 that exposes ArcFM tools such as 'Convert ArcFM Objects'

      ArcGISServerAnalyzeResults.png

        • Re: Performance of ArcFM Layers in ArcGIS Server

          Hi Doug,

           

          For #1, there should be negligible performance impact.  ArcFM Objects, in the database, are just different clsids.  With ArcGIS Server, the only additional overhead involved would be for ArcGIS to see that it's a custom object and then find the .dlls which describe what to do with it - so essentially negligible.

           

          The warnings about custom class extensions prior to publishing to ArcGIS Server will always happen with ArcFM or Designer features.  I've always assumed that this is simply because they're non-Esri objects, and serves as more of an FYI for ArcFM-users (and/or serves as a reminder to install ArcFM Server or the x64 version of Object Reader on each machine in the AGS Site).

           

          For #2, I believe you could change the clsid, and that should suffice.  I am pretty sure I've seen a python sample to do that before, but I'll have to do some digging to find it.  I'll let you know when/if I find it.

           

          Thanks,

          Matt Denton

          1 of 1 people found this helpful
            • Re: Performance of ArcFM Layers in ArcGIS Server
              Doug Krohn

              Thanks Matt.  I feel better about the negligible performance hit you mentioned.  Let me know if you find any scripts we can incorporate into our extraction process.

                • Re: Re: Performance of ArcFM Layers in ArcGIS Server

                  Hi Doug,

                   

                  There's no python to do this (yet), but I have attached some C# code to to what you want.  You could try wrapping it in powershell, or maybe instead implement the following C# gist in python to swap out CLSIDs from under the fgdb and convert ArcFM objects to Esri objects:

                   

                  String theTargetCLSID = "";

                  if (theA3List.Contains(theSourceFeatureClass.AliasName))

                  {

                  Console.WriteLine("Found A3");

                      theTargetCLSID = "{A30E8A2A-C50B-11D1-AEA9-0000F80372B4}";

                  }

                  else if (the52List.Contains(theSourceFeatureClass.AliasName))

                  {

                      Console.WriteLine("Found 52");

                      theTargetCLSID = "{52353152-891A-11D0-BEC6-00805F7C4268}";

                  }

                  else if (theCEList.Contains(theSourceFeatureClass.AliasName))

                  {

                      Console.WriteLine("Found CE");

                      theTargetCLSID = "{CEE8D6B8-55FE-11D1-AE55-0000F80372B4}";

                  }

                   

                   

                  if (theTargetCLSID != "")

                  {

                      //theSourceFeatureClass.CLSID.Value = "{A30E8A2A-C50B-11D1-AEA9-0000F80372B4}";

                      IDataset theCurrentDS = (IDataset)theSourceFeatureClass;

                      IClassSchemaEdit theClassSchemaEdit;

                      theClassSchemaEdit = (IClassSchemaEdit)theCurrentDS;

                      UID theUID = new UID();

                      theUID.Value = theTargetCLSID;

                   

                   

                      ISchemaLock theSchemaLock;

                      theSchemaLock = (ISchemaLock)theClassSchemaEdit;

                      theSchemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);

                      theClassSchemaEdit.AlterInstanceCLSID(theUID);

                      theClassSchemaEdit.AlterClassExtensionCLSID(null, null);

                      theSchemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);

                  }

                   

                  By the way, I can take no credit for either of these.  I dug them out of the old forums archives.  The code belonged to the user timdine, and the attachment is the result from his subsequent Tech Support case.