Hiểu tại sao công cụ phân tích đường dẫn chi phí ArcPy nhanh hơn ArcObjects? [đóng cửa]


15

Mặc dù tôi sử dụng python để tạo các kịch bản / dịch vụ xử lý địa lý, tôi có ấn tượng rằng việc sử dụng ArcObjects để thực hiện các thao tác tương đương sẽ có hiệu suất tốt hơn.

Tôi đã đăng ArcGIS Server GP Service - RasterIO.dll gặp sự cố ArcSOC.exeArcGIS Geoprocessing Script chạy tốt trên Desktop nhưng gặp sự cố khi Dịch vụ xử lý địa lý? trong vài ngày qua về việc nhận các tập lệnh xử lý địa lý sử dụng các công cụ Phân tích không gian để làm việc như các dịch vụ xử lý địa lý. Hạn chót của tôi đang đến rất nhanh, vì vậy tôi đã quyết định đi theo con đường SOE để đạt được chức năng mong muốn.

Việc phân tích đường dẫn chi phí trong ArcObjects tương đối đơn giản khi sử dụng các Phương thức .NET ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , cụ thể là Phương thức CostDistanceFull () và CostPath ().

Một số đoạn mã về cách tôi đang làm:

Con trăn

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

Một phân tích đường dẫn chi phí trong ArcPy (sử dụng sa.CostDistance và sa.CostPath) mất khoảng 15-20 giây. Sử dụng cùng các đầu vào chính xác, thói quen dựa trên ArcObjects mất 55-60 giây. Ngay cả khi sử dụng .NET Geoprocessor cũng chậm hơn đáng kể so với arcpy.

Tôi đoán câu hỏi của tôi ở đây là:

  1. Các triển khai ArcPy và ArcObjects có cùng cơ sở mã không (thông qua các trình bao bọc Python và .NET của chúng)?
  2. Bất kỳ mẹo nào để tối ưu hóa phân tích Đường dẫn chi phí dựa trên ArcObject?

2
Bạn đã lập hồ sơ mã của mình để tìm iut chính xác cuộc gọi nào mất nhiều thời gian nhất chưa? Bạn có thể hiển thị một đoạn mã?
Ragi Yaser Burhum

Sự hiểu biết của tôi là ArcPy chỉ là một trình bao bọc xung quanh ArcObjects nên rất tò mò. Tôi không biết điều này có liên quan hay không nhưng một câu trả lời ở đây: gis.stackexchange.com/questions/171304/ mẹo .. Lưu ý rằng các công cụ GeoProcessing cần tải, so với các công cụ GUI. Vì vậy, nếu ArcPy khởi tạo mã liên quan trước hoặc bọc một hàm GUI thay vì hàm ToolBox, nó có thể bỏ qua một số thời gian thiết lập. Đủ dễ dàng để kiểm tra bằng cách xem nếu khoảng cách tốc độ giảm với bộ dữ liệu lớn hơn.
AnserGIS

Theo Tour , chỉ nên có một câu hỏi cho mỗi câu hỏi.
PolyGeo

Câu trả lời:


0

Tôi tin rằng đó là vì Python của bạn đang sử dụng ArcPy để gọi các tác vụ Geoprocessing, đang chạy trong các quy trình 64 bit . ArcObjects xảy ra trong các quy trình 32 bit .


2
Không có đủ thông tin trong bài viết này để đưa ra những giả định đó. Mặc dù vậy, Máy chủ là 64 bit hoặc nếu anh ta đã cài đặt 64 bit BG, anh ta có thể thực thi công cụ chức năng của mình để chống lại nó. Tuy nhiên, để giải trí suy nghĩ, chỉ cần chuyển từ 32 đến 64 bit sẽ không tăng hiệu suất. Nó rất tình huống khi / nếu 64 bit là 'nhanh hơn' 32 bit.
KHibma

OP có thể làm rõ liệu những giả định này có cơ sở hay không. Các liên kết tôi cung cấp hỗ trợ các giả định, như hiệu suất sẽ tốt hơn vì có quyền truy cập vào nhiều tài nguyên hệ thống hơn, v.v. Có một lý do tại sao hầu hết các hệ điều hành là 64 bit ngày nay, và một trong những vấn đề lớn là tăng hiệu suất. Vì vậy, tất cả mọi thứ đều bằng nhau, đặc biệt là với số lượng lớn, các quy trình 64 bit sẽ thực hiện các quy trình 32 bit.
alexGIS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.