Kết quả bất thường để kiểm tra tốc độ địa lý


9

Tôi đã quan sát hiệu suất bất thường với một kịch bản xử lý địa lý Python. Kịch bản (đính kèm) thực hiện các hành động sau:

  1. Sử dụng con trỏ tìm kiếm để tra cứu vùng UTM tương ứng với các tính năng đa giác
  2. Tạo đối tượng tham chiếu không gian dựa trên kết quả con trỏ tìm kiếm
  3. Chuyển đổi .csv thành lớp đối tượng và sau đó thành lớp đối tượng điểm

Tôi đã nhận thấy thời gian xử lý khác nhau rõ rệt dựa trên cách chạy tập lệnh:

  • Xử lý 32 bit bằng IDLE = 203 giây
  • Công cụ kịch bản tiền cảnh xử lý 32 bit = 91 giây
  • Công cụ kịch bản nền xử lý 64 bit = 206 giây

Tại sao kịch bản này sẽ thực hiện rất khác nhau với các điều kiện trên? Tôi chắc chắn sẽ không mong đợi công cụ tập lệnh 32 bit chạy ở nền trước sẽ nhanh gấp 2 lần các phương thức khác.


import arcpy, os, time

###IDLE Parameters
##fc = r'C:\path\to\polygon\fc\with\utm\zones\and\features'
##outws = r'C:\out\location'
##arcpy.env.workspace = r'C:\workspace'

####################
## Script tool parameters
fc = arcpy.GetParameterAsText(0)    # Feature class
outws = arcpy.GetParameterAsText(1) # Folder
arcpy.env.workspace = arcpy.GetParameterAsText(2)   # Workspace
####################

# Tables are .csv
tables = arcpy.ListTables()

start = time.clock()

# Look up which UTM zone .csv features are in
for t in tables:
    quad = t[7:17]
    print quad
    whereClause = """ "QUADID" LIKE '%s' """ % quad
    with arcpy.da.SearchCursor(fc, ("QUADID","ZONE"), whereClause) as cursor:
        for row in cursor:
            if row[0] == quad:
                utmZone = row[1]
                if utmZone == 10:
                    sr = arcpy.SpatialReference(26910)  # NAD_1983_UTM_Zone_10N
                elif utmZone == 11:
                    sr = arcpy.SpatialReference(26911)  # NAD_1983_UTM_Zone_11N
                elif utmZone == 12:
                    sr = arcpy.SpatialReference(26912)  # NAD_1983_UTM_Zone_12N
                elif utmZone == 13:
                    sr = arcpy.SpatialReference(26913)   # NAD_1983_UTM_Zone_13N
                else:
                    print "The UTM Zone is outside 10-13"
            else:
                pass

    # Convert .csv to feature class
    try:
        outLayer = "in_memory"
        # Now with the sr defined, create the XY Event Layer
        arcpy.MakeXYEventLayer_management(t, "x", "y", outLayer, sr, "z")
        arcpy.FeatureClassToFeatureClass_conversion(outLayer, outws, t[7:17])
        arcpy.Delete_management("in_memory")
        end = time.clock()
        print "In_memory method finished in %s seconds" % (end - start)

    except:
        # Print any error messages
        print arcpy.GetMessages(2)

print "Processing complete"

1
Mất bao lâu để nhập Arcpy chỉ riêng nó? Có một lỗi hình thành trong bài. Có nên thử: được bên trong vòng lặp for?
Nathan W

2
Tôi nghĩ rằng quan điểm của @ NathanW import arcpyđáng để xem xét trước tiên vì dường như thời gian chỉ được yêu cầu bởi các tuyến IDLE và 64 bit trong ba bài kiểm tra của bạn, nhưng thêm gần hai phút có vẻ quá mức. Hãy thử chạy một công cụ không có gì nhiều ngoài thời gian nhập ArcPy.
PolyGeo

3
Tôi sẽ khá an toàn để nói rằng đó là import arcpydòng. Lần trước tôi sử dụng arcpy, nó rất chậm để nhập từ bên ngoài. ArcGIS sẽ có cái đó đã được nhập trong Python bên trong của nó để quá trình nhập đã được lưu vào bộ đệm.
Nathan W

3
@Nathan và những người khác là hoàn toàn chính xác. Chạy một quy trình thông qua IDLE hoặc dòng lệnh sẽ bị ảnh hưởng khi bạn gọi 'nhập Arcpy'. Tuy nhiên, bạn có thể có được sự đánh đổi cho các quy trình rất lớn, nơi bạn có được thời gian 'quay lại' thông qua hiệu suất được cải thiện. Chạy một quá trình nền cũng có một thời gian vì ArcGIS có hiệu lực bắt đầu một phiên ArcMap khác. Cuối cùng, bạn cũng có các biến khác mà bạn cần loại bỏ trong bản dùng thử, chẳng hạn như sự khác biệt về phần cứng giữa các máy 32 và 64 bit của bạn và những quy trình khác đã tiêu tốn tài nguyên trong quá trình dùng thử của bạn, v.v.
MappaGnosis

2
+1 @JayLaura. Có thể đi xa hơn và hồ sơ. [ General python doc] [ docs.python.org/2/l Library / profile.html] và [ stackexchange posting] [ stackoverflow.com/questions/582336/ chất .
Roland

Câu trả lời:



6

Tôi có một lý thuyết.

Tôi nghĩ vấn đề có thể là xác nhận đầu ra của bạn hoặc đầu vào của bạn. Trước khi một công cụ GP chạy, arcpy xác nhận các tham số, ví dụ, liệu lớp tính năng đầu ra đã tồn tại chưa.

Trong ArcMap, tất cả các nội dung của không gian làm việc (thư mục) đều được lưu trong bộ nhớ cache và việc xác thực có thể được thực hiện đối với "chế độ xem" của không gian làm việc - trong bộ nhớ - nhanh. Điều này có thể gây nhầm lẫn nếu bộ dữ liệu được thêm bằng công cụ không phải ArcGIS, yêu cầu arcpy.RefreshCatalog () được chạy để đồng bộ hóa chế độ xem danh mục với trạng thái của không gian làm việc (thư mục).

Nếu thư mục của bạn rất lớn và bạn đang chạy bên ngoài ArcGIS, Arcpy có thể phải tạo một danh sách thư mục mỗi lần để xác thực đầu ra FeatureClassToFeatureClass của bạn. Nếu có nhiều mục trong thư mục, điều này thực sự có thể bị chậm.

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.