Capire perché lo strumento di analisi del percorso dei costi ArcPy è più veloce di ArcObjects? [chiuso]


15

Anche se utilizzo python per creare script / servizi di geoprocessing, avevo l'impressione che l'uso di ArcObjects per eseguire operazioni equivalenti avrebbe prestazioni migliori.

Ho pubblicato il servizio GP di ArcGIS Server - RasterIO.dll si arresta in modo anomalo ArcSOC.exe e ArcGIS Geoprocessing Script funziona bene su Desktop ma si arresta in modo anomalo come Servizio di geoprocessing? negli ultimi due giorni su come ottenere script di geoprocessing che utilizzano gli strumenti di Analizzatore spaziale per funzionare come servizi di geoprocessing. La mia scadenza si sta avvicinando rapidamente, quindi ho deciso di seguire il percorso SOE per ottenere la funzionalità desiderata.

Ottenere un'analisi del percorso dei costi in ArcObjects è stato relativamente semplice utilizzando i .NET ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , in particolare i metodi CostDistanceFull () e CostPath ().

Alcuni frammenti di codice di come sto facendo le cose:

Pitone

# 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);

Un'analisi del percorso dei costi in ArcPy (utilizzando sa.CostDistance e sa.CostPath) richiede circa 15-20 secondi. Utilizzando gli stessi input esatti, la routine basata su ArcObjects richiede 55-60 sec. Anche l'uso di .NET Geoprocessor è significativamente più lento di arcpy.

Immagino che le mie domande qui siano:

  1. Le implementazioni ArcPy e ArcObjects puntano alla stessa base di codice (tramite i loro wrapper Python e .NET)?
  2. Qualche consiglio per ottimizzare l'analisi del percorso dei costi basata su ArcObject?

2
hai profilato il tuo codice per trovare esattamente quale chiamata impiega più tempo? Puoi mostrare uno snippet di codice?
Ragi Yaser Burhum,

La mia comprensione era ArcPy solo un involucro attorno ad ArcObjects, quindi è curioso. Non so se questo sia pertinente, ma una risposta qui: gis.stackexchange.com/questions/171304/… .. Nota che gli strumenti di GeoProcessing devono essere caricati, rispetto agli strumenti della GUI. Pertanto, se ArcPy crea un'istanza del codice pertinente in anticipo o esegue il wrapping di una funzione GUI anziché della funzione ToolBox, potrebbe saltare un po 'di tempo di impostazione. Abbastanza facile da verificare vedendo se l'intervallo di velocità si riduce con set di dati più grandi.
AnserGIS

Come per il Tour ci dovrebbe essere solo una domanda per ogni domanda.
PolyGeo

Risposte:


0

Credo che sia perché il tuo Python sta usando ArcPy per chiamare le attività di Geoprocessing, che sono in esecuzione in processi a 64 bit . ArcObjects si verifica in processi a 32 bit .


2
Non ci sono abbastanza informazioni in questo post per fare queste ipotesi. Anche così, Server è 64 bit o se ha 64 bit BG installato potrebbe eseguire il suo strumento di funzione contro di esso. Tuttavia, per intrattenere il pensiero, passare semplicemente da 32 a 64 bit non fornisce un aumento delle prestazioni. È molto situazionale quando / se 64 bit è "più veloce" di 32 bit.
KHibma,

OP può chiarire se questi presupposti sono fuori base o meno. I collegamenti che ho fornito supportano i presupposti, ad esempio le prestazioni sono migliori perché c'è accesso a più risorse di sistema, ecc. C'è un motivo per cui la maggior parte dei sistemi operativi sono a 64 bit in questi giorni, e uno dei maggiori è l'aumento delle prestazioni. Quindi, a parità di condizioni, soprattutto con lo scricchiolio di numeri pesanti, i processi a 64 bit eseguiranno i processi a 32 bit.
alexGIS,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.