วิธีที่เร็วที่สุดในการนับจำนวนคุณลักษณะในคลาสคุณลักษณะหรือไม่


35

ด้วยการแนะนำของโมดูลการเข้าถึงข้อมูลใน arcpy (ค้นหาเคอร์เซอร์ที่เร็วกว่า 30x) ฉันต้องการทราบว่าการนับคุณสมบัติที่ตรงกับเกณฑ์ sql นั้นเร็วกว่าวิธี MakeTableView + GetCount แบบดั้งเดิมหรือไม่


12
วิธีที่โง่คือการนับคุณสมบัติไม่ได้เป็นเพียงคุณสมบัติของ arcpy วัตถุที่อธิบาย
Grant Humphries

มันค่อนข้างง่ายด้วยogrinfoกับOGR SQLบางตัว ชุดข้อมูลมีบางอย่างที่เหมือนกับ 170000 เรคคอร์ดและการค้นหาไวด์การ์ดในVARCHARฟิลด์ที่ไม่ได้ทำดัชนีนั้นกลับมาในไม่กี่วินาที ogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
elrobis

คำตอบ:


2

ฉันได้ทดสอบวิธีการแก้ปัญหาจากคำตอบข้างต้นและในโลกแห่งความเป็นจริงข้อมูลของฉันแตกต่างกันเล็กน้อย ตรงข้ามกับผลลัพธ์ในคำตอบอื่น ๆ เวลาของฉันสำหรับ arcpy.MakeTableView_management และ arcpy.da.SearchCursor ภายใน ArcMap เหมือนกัน

ฉันได้ทดสอบชุดรูปแบบที่มีและไม่มีข้อความค้นหาโปรดดูรหัสสำหรับรุ่นแบบสอบถามและผลลัพธ์ที่วัดได้สุดท้ายด้านล่าง:

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

ผลลัพธ์ด้านล่าง:

    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

มันเป็นเวลาประมาณ 7 ปีแล้วตั้งแต่คำถามตอบดังนั้นฉันหวังว่าพวกเขาจะปรับปรุง SDK ของพวกเขา !!! =) ขอบคุณสำหรับการทดสอบด้วยตัวเอง Miro
Michael Markieta

47

ฉันใช้ตัวอย่างที่มี 1 ล้านคะแนนที่สร้างแบบสุ่มภายในของฐานข้อมูลไฟล์ ที่แนบมาที่นี่

นี่คือรหัสบางส่วนเพื่อให้เราเริ่มต้น:

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

และผลเบื้องต้น:

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

ลองนึกภาพชุดข้อมูลที่มีขนาดใหญ่และซับซ้อนกว่านี้ SearchCursor จะรวบรวมข้อมูลอย่างไม่มีกำหนด

ฉันไม่พอใจกับผลลัพธ์ทั้งหมดอย่างไรก็ตามโมดูล DataAccess กำลังถูกใช้อย่างกว้างขวางในแวดวงการพัฒนา GIS ของเรา ฉันต้องการสร้างคำจำกัดความฟังก์ชันของเราใหม่ด้วยโมดูลนี้เนื่องจากมีความยืดหยุ่นมากกว่าเมธอด MakeTableView + GetCount


บทสรุปที่ดี เพื่อความสมบูรณ์ฉันต้องการเพิ่ม IMO ที่ควรจะเร็วที่สุด แต่อันที่จริงแล้วเป็นวิธีที่ช้าที่สุด (ช้ากว่า 10x) 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.