Czy rozumiesz, dlaczego narzędzie ArcPy Cost Path Analysis jest szybsze niż ArcObjects? [Zamknięte]

15

Chociaż używam Pythona do tworzenia skryptów / usług geoprzetwarzania, miałem wrażenie, że użycie ArcObjects do wykonania równoważnych operacji będzie miało lepszą wydajność.

Mam pisał ArcGIS Server GP Service - RasterIO.dll upaść ArcSOC.exe i ArcGIS Geoprzetwarzania Skrypt działa dobrze w Pulpicie ale wywala jak Geoprzetwarzania Service? w ciągu ostatnich kilku dni na temat uzyskiwania skryptów geoprzetwarzania, które używają narzędzi Spatial Analyst do pracy jako usługi geoprzetwarzania. Mój termin zbliża się bardzo szybko, więc postanowiłem pójść drogą SOE, aby osiągnąć pożądaną funkcjonalność.

Uzyskanie analizy ścieżki kosztów w ArcObjects było stosunkowo proste przy użyciu metod .NET ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , w szczególności metod CostDistanceFull () i CostPath ().

Niektóre fragmenty kodu dotyczące tego, jak to robię:

Pyton

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

DO#

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

Analiza ścieżki kosztów w ArcPy (przy użyciu sa.CostDistance i sa.CostPath) zajmuje około 15-20 sekund. Wykorzystując dokładnie te same dane wejściowe, procedura oparta na ArcObjects zajmuje 55-60 sekund. Nawet korzystanie z Geoprocesora .NET jest znacznie wolniejsze niż arkowanie.

Myślę, że moje pytania są następujące:

  1. Czy implementacje ArcPy i ArcObjects wskazują na tę samą bazę kodu (poprzez ich opakowania w Pythonie i .NET)?
  2. Wszelkie wskazówki dotyczące optymalizacji analizy ścieżki kosztów opartej na ArcObject?
użytkownik890
źródło
2
czy profilowałeś swój kod, aby znaleźć dokładnie, które połączenie trwa najdłużej? Czy możesz pokazać fragment kodu?
Ragi Yaser Burhum
Zrozumiałem, że ArcPy to tylko opakowanie ArcObjects, więc to jest ciekawe. Nie wiem, czy jest to istotne, ale jedna odpowiedź tutaj: gis.stackexchange.com/questions/171304/ ... .. Zauważ, że narzędzia GeoProcessing muszą zostać załadowane w porównaniu z narzędziami GUI. Tak więc, jeśli ArcPy utworzy instancję odpowiedniego kodu z wyprzedzeniem lub otoczy funkcję GUI zamiast funkcji ToolBox, może pominąć pewien czas konfiguracji. Łatwo to sprawdzić, sprawdzając, czy różnica prędkości zmniejsza się przy większych zestawach danych.
AnserGIS
Zgodnie z trasą powinno być zadawane tylko jedno pytanie na pytanie.
PolyGeo

Odpowiedzi:

0

Uważam, że dzieje się tak, ponieważ Twój Python używa ArcPy do wywoływania zadań Geoprocessing, które są uruchomione w procesach 64-bitowych . ArcObjects dzieje się w procesach 32-bitowych .

alexGIS
źródło
2
W tym poście nie ma wystarczających informacji, aby przyjąć te założenia. Mimo to, serwer jest 64-bitowy lub jeśli ma zainstalowany 64-bitowy BG, mógłby wykonać na nim swoje narzędzie funkcyjne. Jednak, aby zabawić tę myśl, samo przejście z 32 do 64 bitów nie zapewnia wzrostu wydajności. Jest to bardzo sytuacyjne, gdy / jeśli 64-bitowy jest „szybszy” niż 32-bitowy.
KHibma
PO może wyjaśnić, czy te założenia są nieuzasadnione, czy nie. Łącza, które podałem, wspierają założenia, takie jak lepsza wydajność, ponieważ jest dostęp do większej ilości zasobów systemowych itp. Istnieje powód, dla którego większość systemów operacyjnych ma obecnie 64-bitowe rozmiary, a jednym z dużych jest wzrost wydajności. Tak więc wszystkie rzeczy są równe, szczególnie przy dużym obciążeniu liczbowym, procesy 64-bitowe wykonają procesy 32-bitowe.
alexGIS