Memahami mengapa alat Analisis Jalur ArcPy lebih cepat dari ArcObjects? [Tutup]

15

Walaupun saya menggunakan python untuk membuat skrip / layanan geoproses, saya mendapat kesan bahwa menggunakan ArcObjects untuk melakukan operasi yang setara akan memiliki kinerja yang lebih baik.

Saya telah memposting ArcGIS Server GP Service - RasterIO.dll menabrak ArcSOC.exe dan ArcGIS Geoprocessing Script berjalan dengan baik di Desktop tetapi macet sebagai Layanan Geoprocessing? selama beberapa hari terakhir tentang mendapatkan skrip geoproses yang menggunakan alat Spatial Analyst untuk bekerja sebagai layanan geoproses. Tenggat waktu saya semakin dekat, jadi saya memutuskan untuk mengambil rute SOE untuk mencapai fungsionalitas yang diinginkan.

Mendapatkan analisis jalur biaya di ArcObjects relatif mudah menggunakan .NET ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , khususnya Metode CostDistanceFull () dan CostPath ().

Beberapa cuplikan kode tentang cara saya melakukan sesuatu:

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

Analisis jalur biaya di ArcPy (menggunakan sa.CostDistance dan sa.CostPath) membutuhkan waktu sekitar 15-20 detik. Menggunakan input yang sama persis, rutin berbasis ArcObjects membutuhkan waktu 55-60 detik. Bahkan menggunakan .NET Geoprocessor secara signifikan lebih lambat daripada arcpy.

Saya kira pertanyaan saya di sini adalah:

  1. Apakah implementasi ArcPy dan ArcObjects menunjuk pada basis kode yang sama (melalui pembungkus Python dan .NET)?
  2. Adakah tips untuk mengoptimalkan analisis Cost Path berbasis ArcObject?
pengguna890
sumber
2
Sudahkah Anda membuat profil kode Anda untuk menemukan iut persis panggilan mana yang paling lama? Bisakah Anda menunjukkan cuplikan kode?
Ragi Yaser Burhum
Pemahaman saya adalah ArcPy hanya pembungkus di sekitar ArcObjects sehingga itu penasaran. Saya tidak tahu apakah ini relevan tetapi satu jawaban di sini: gis.stackexchange.com/questions/171304/… .. Catatan bahwa alat GeoProcessing perlu dimuat, dibandingkan dengan alat GUI. Jadi, jika ArcPy instantiate kode yang relevan di muka atau membungkus fungsi GUI alih-alih fungsi ToolBox, mungkin melewatkan beberapa waktu pengaturan. Cukup mudah untuk memeriksa dengan melihat apakah kesenjangan kecepatan berkurang dengan kumpulan data yang lebih besar.
AnserGIS
Sesuai dengan Tur, seharusnya hanya ada satu pertanyaan yang diajukan per pertanyaan.
PolyGeo

Jawaban:

0

Saya percaya itu karena Python Anda menggunakan ArcPy untuk memanggil tugas-tugas Geoprocessing, yang berjalan dalam proses 64-bit . ArcObjects terjadi dalam proses 32-bit .

alexGIS
sumber
2
Tidak ada informasi yang cukup dalam posting ini untuk membuat asumsi tersebut. Meski begitu, Server adalah 64bit atau jika dia memiliki 64bit BG diinstal dia bisa menjalankan alat fungsinya terhadapnya. Namun, untuk menghibur pikiran, hanya beralih dari 32 ke 64bit tidak memberikan peningkatan kinerja. Ini sangat situasional ketika / jika 64bit 'lebih cepat' dari 32bit.
KHibma
OP dapat mengklarifikasi apakah asumsi ini tidak benar atau tidak. Tautan yang saya berikan mendukung asumsi, seperti kinerja menjadi lebih baik karena ada akses ke lebih banyak sumber daya sistem, dll. Ada alasan mengapa sebagian besar OS 64 bit saat ini, dan salah satu yang besar adalah peningkatan kinerja. Jadi semua hal yang sama, terutama dengan angka berat, proses 64 bit akan keluar melakukan proses 32 bit.
alexGIS