Verstehen Sie, warum ArcPy Cost Path Analysis schneller als ArcObjects ist? [geschlossen]

15

Obwohl ich Python zum Erstellen von Geoverarbeitungsskripten / -diensten verwende, hatte ich den Eindruck, dass die Verwendung von ArcObjects für die entsprechenden Vorgänge eine bessere Leistung bietet.

Ich habe den ArcGIS Server GP Service veröffentlicht - RasterIO.dll stürzt ab ArcSOC.exe und das ArcGIS-Geoverarbeitungsskript wird auf dem Desktop einwandfrei ausgeführt , stürzt jedoch als Geoverarbeitungsdienst ab? In den letzten Tagen haben wir uns über das Abrufen von Geoverarbeitungsskripten unter Verwendung von Spatial Analyst-Tools als Geoverarbeitungs-Services informiert. Meine Deadline rückt immer näher und ich habe mich entschieden, den SOE-Weg einzuschlagen, um die gewünschte Funktionalität zu erreichen.

Das Abrufen einer Kostenpfadanalyse in ArcObjects war mit den .NET- Methoden ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , insbesondere den Methoden CostDistanceFull () und CostPath (), relativ einfach .

Einige Code-Schnipsel, wie ich Dinge mache:

Python

# Get Cost Path Origin and Destination Points
inputPointsShp = 'D:/RasterStuff/test_points.shp'
arcpy.MakeFeatureLayer_management(inputPointsShp,"origin",' "TYPE" = \'ORIGIN\' ')
arcpy.MakeFeatureLayer_management(inputPointsShp,"destination",' "TYPE" = \'DESTINATION\' ')

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Execute CostDistance
outCostDistance = CostDistance("origin",SOURCE_RASTER,"#","backlink")

# Execute CostPath
outCostPath = CostPath("destination", outCostDistance,"backlink")

# Convert Result to Polyline
arcpy.RasterToPolyline_conversion(outCostPath, "leastCostPath")
featSet = arcpy.FeatureSet("leastCostPath")

C #

IDistanceOp distanceOp = new RasterDistanceOpClass();
IRasterBandCollection costDistanceRaster = (IRasterBandCollection)distanceOp.CostDistanceFull((IGeoDataset)sourceFc, (IGeoDataset)raster, true, true, false);
IRasterBand distanceRaster = costDistanceRaster.Item(0);
IRasterBand backLinkRaster = costDistanceRaster.Item(1);

IGeoDataset costPath = distanceOp.CostPath((IGeoDataset)destFc, (IGeoDataset)distanceRaster, (IGeoDataset)backLinkRaster, ESRI.ArcGIS.SpatialAnalyst.esriGeoAnalysisPathEnum.esriGeoAnalysisPathForEachCell);

Eine Kostenpfadanalyse in ArcPy (mit sa.CostDistance und sa.CostPath) dauert ca. 15-20 Sekunden. Bei Verwendung der exakt gleichen Eingaben dauert die auf ArcObjects basierende Routine 55-60 Sekunden. Auch die Verwendung des .NET-Geoprozessors ist deutlich langsamer als arcpy.

Ich denke meine Fragen hier sind:

  1. Zeigen die ArcPy- und ArcObjects-Implementierungen auf dieselbe Codebasis (über ihre Python- und .NET-Wrapper)?
  2. Gibt es Tipps zur Optimierung der ArcObject-basierten Kostenpfadanalyse?
user890
quelle
2
Haben Sie Ihren Code profiliert, um herauszufinden, welcher Anruf am längsten dauert? Können Sie ein Code-Snippet anzeigen?
Ragi Yaser Burhum
Nach meinem Verständnis war ArcPy nur ein Wrapper um ArcObjects, also ist das neugierig. Ich weiß nicht, ob dies relevant ist, aber eine Antwort hier: gis.stackexchange.com/questions/171304/… .. Beachten Sie, dass GeoProcessing-Tools im Vergleich zu GUI-Tools geladen werden müssen. Wenn ArcPy den relevanten Code im Voraus instanziiert oder eine GUI-Funktion anstelle der ToolBox-Funktion umschließt, wird möglicherweise eine gewisse Einrichtungszeit übersprungen. Es ist leicht zu überprüfen, ob sich die Geschwindigkeitslücke bei größeren Datenmengen verringert.
AnserGIS
Gemäß der Tour sollte nur eine Frage pro Frage gestellt werden.
PolyGeo

Antworten:

0

Ich glaube, das liegt daran, dass Ihr Python ArcPy zum Aufrufen von Geoverarbeitungs-Tasks verwendet, die in 64-Bit-Prozessen ausgeführt werden . ArcObjects wird in 32-Bit-Prozessen ausgeführt .

alexGIS
quelle
2
Dieser Beitrag enthält nicht genügend Informationen, um diese Annahmen zu treffen. Trotzdem ist Server 64bit oder wenn er 64bit BG installiert hat, kann er sein Funktionstool dagegen ausführen. Um den Gedanken zu unterhalten, bedeutet ein Übergang von 32 auf 64 Bit jedoch keine Leistungssteigerung. Es ist sehr situativ, wenn / wenn 64bit "schneller" als 32bit ist.
KHibma
OP kann klären, ob diese Annahmen nicht stichhaltig sind oder nicht. Die Links, die ich zur Verfügung gestellt habe, stützen die Vermutungen, dass die Leistung besser ist, weil auf mehr Systemressourcen usw. zugegriffen werden kann. Es gibt einen Grund, warum die meisten Betriebssysteme heutzutage 64-Bit sind, und einer der großen Gründe ist die Leistungssteigerung. Wenn alle Dinge gleich sind, führen 64-Bit-Prozesse, insbesondere bei starker Zahlenverarbeitung, 32-Bit-Prozesse aus.
alexGIS