Cách nhanh nhất để đếm số lượng tính năng trong một lớp tính năng?


35

Với việc giới thiệu mô-đun Truy cập dữ liệu trong arcpy (con trỏ tìm kiếm nhanh hơn 30 lần), tôi muốn biết liệu tính năng phù hợp với tiêu chí sql có nhanh hơn phương pháp MakeTableView + GetCount truyền thống không?


12
Thật là ngu ngốc khi số tính năng không chỉ là một thuộc tính của một đối tượng Arcpy. Mô tả
Grant Humphries

Điều này khá dễ dàng với ogrinfo với một số OGR SQL . Bộ dữ liệu có thứ gì đó giống như 170000 bản ghi và tìm kiếm ký tự đại diện này trên một VARCHARtrường không được tìm thấy đã trở lại chỉ sau vài giây. ogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
elrobis

Câu trả lời:


2

Tôi đã thử nghiệm giải pháp từ câu trả lời ở trên và trên dữ liệu thế giới thực của tôi, sự khác biệt là không đáng kể. Đối lập với kết quả trong câu trả lời khác, thời gian của tôi cho arcpy.MakeTableView_man Quản lý và arcpy.da.SearchCoder trong ArcMap là như nhau.

Tôi đã thử nghiệm các biến thể có và không có truy vấn, vui lòng xem mã cho phiên bản truy vấn và kết quả đo cuối cùng bên dưới:

@staticmethod
def query_features(feature_class, query):

    # Method 1
    time.sleep(5)  # Let the cpu/ram calm before proceeding!
    start_time = time.clock()
    count = len(list(i for i in arcpy.da.SearchCursor(feature_class, ["OBJECTID"], query)))
    end_time = time.clock()
    arcpy.AddMessage("Method 1 finished in {} seconds".format((end_time - start_time)))
    arcpy.AddMessage("{} features".format(count))

    # Method 2
    time.sleep(5)  # Let the cpu/ram calm before proceeding!
    start_time = time.clock()
    arcpy.MakeTableView_management(feature_class, "myTableView", query)
    count = int(arcpy.GetCount_management("myTableView").getOutput(0))

    end_time = time.clock()
    arcpy.AddMessage("Method 2 in {} seconds".format((end_time - start_time)))
    arcpy.AddMessage("{} features".format(count))

Kết quả dưới đây:

    No query:
    Method 1 finished in 5.3616442 seconds
    804140 features
    Method 2 in 4.2843138 seconds
    804140 features

    Many results query:
    Method 1 finished in 12.7124766 seconds
    518852 features
    Method 2 in 12.1396602 seconds
    518852 features

    Few results query:
    Method 1 finished in 11.1421476 seconds
    8 features
    Method 2 in 11.2232503 seconds
    8 features

Chà, đã khoảng 7 năm kể từ khi câu hỏi được trả lời nên tôi hy vọng họ đã cải thiện SDK của mình !!! =) cảm ơn vì đã tự mình kiểm tra Miro.
Michael Markieta

47

Tôi đang sử dụng một ví dụ với 1 triệu điểm được tạo ngẫu nhiên bên trong cơ sở dữ liệu filegeodatabase. Đính kèm tại đây .

Đây là một số mã để chúng tôi bắt đầu:

import time
import arcpy

arcpy.env.workspace = "C:\CountTest.gdb"

time.sleep(5) # Let the cpu/ram calm before proceeding!

"""Method 1"""
StartTime = time.clock()
with arcpy.da.SearchCursor("RandomPoints", ["OBJECTID"]) as cursor:
    rows = {row[0] for row in cursor}

count = 0
for row in rows:
    count += 1

EndTime = time.clock()
print "Finished in %s seconds" % (EndTime - StartTime)
print "%s features" % count

time.sleep(5) # Let the cpu/ram calm before proceeding!

"""Method 2"""
StartTime2 = time.clock()
arcpy.MakeTableView_management("RandomPoints", "myTableView")
count = int(arcpy.GetCount_management("myTableView").getOutput(0))

EndTime2 = time.clock()
print "Finished in %s seconds" % (EndTime2 - StartTime2)
print "%s features" % count

Và một số kết quả ban đầu:

>>> 
Finished in 6.75540050237 seconds
1000000 features
Finished in 0.801474780332 seconds
1000000 features
>>> =============================== RESTART ===============================
>>> 
Finished in 6.56968596918 seconds
1000000 features
Finished in 0.812731769756 seconds
1000000 features
>>> =============================== RESTART ===============================
>>> 
Finished in 6.58207512487 seconds
1000000 features
Finished in 0.841122157314 seconds
1000000 features

Hãy tưởng tượng bộ dữ liệu lớn hơn, phức tạp hơn. SearchCoder sẽ thu thập dữ liệu vô thời hạn.

Tôi hoàn toàn không hài lòng với kết quả này, tuy nhiên, mô-đun DataAccess đang được sử dụng rộng rãi trong vòng tròn phát triển GIS của chúng tôi. Tôi đang tìm cách xây dựng lại một số định nghĩa hàm của chúng tôi với mô-đun này vì nó linh hoạt hơn phương pháp MakeTableView + GetCount.


Roundup đẹp. Để hoàn thiện, tôi muốn thêm những gì IMO nên nhanh nhất, nhưng thực tế là phương pháp chậm nhất (chậm hơn 10 lần). arcpy.Statistics_analysis("RandomPoints", r"in_memory\count", [["OBJECTID", "COUNT"]]) cursor = arcpy.da.SearchCursor(r"in_memory\count", ["COUNT_OBJECTID"]) row = cursor.next() del cursor count = row[0]
Berend
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.