फीचर क्लास में सुविधाओं की संख्या को गिनने का सबसे तेज़ तरीका?


35

आर्किया (30x तेज खोज कर्सर) में डेटा एक्सेस मॉड्यूल की शुरुआत के साथ, मैं जानना चाहता हूं कि क्या sql मापदंड से मेल खाने वाली विशेषताएं पारंपरिक MakeTableView + GetCount कार्यप्रणाली से तेज हैं?


12
यह कितना बेवकूफी भरा है कि फीचर काउंट सिर्फ एक चापलूसी का गुण नहीं है। ऑब्जेक्ट लिखें
ग्रांट

यह कुछ OGR SQL के साथ ogrinfo के साथ बहुत आसान था । डेटासेट में 170000 रिकॉर्ड्स की तरह कुछ है, और एक अनइन्डेक्सड फ़ील्ड पर यह वाइल्डकार्ड खोज कुछ ही सेकंड में वापस आ गया। VARCHARogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
एल्प्रोबिस

जवाबों:


2

मैंने ऊपर दिए गए उत्तर से समाधान का परीक्षण किया है और मेरी वास्तविक दुनिया के आंकड़ों पर अंतर नगण्य है। अन्य उत्तर में परिणामों के विपरीत, आर्कपी के भीतर मेरे संग्रह के लिए कई बार।

मैंने क्वेरी के साथ और उसके बिना विविधताओं का परीक्षण किया है, कृपया क्वेरी संस्करण के लिए कोड देखें, और अंतिम मापा परिणाम नीचे दिए गए हैं:

@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 साल हो गया है क्योंकि सवाल का जवाब दिया गया था इसलिए मुझे आशा है कि उन्होंने अपने एसडीके में सुधार किया है !!! =) अपने आप को Miro परीक्षण करने के लिए धन्यवाद।
माइकल मार्किटा

47

मैं एक filegeodatabase के अंदर 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 अनिश्चित काल तक क्रॉल करेगा।

मैं परिणामों से असंतुष्ट नहीं हूं, हालांकि, हमारे जीआईएस विकास चक्र में बड़े पैमाने पर डेटासाउट मॉड्यूल का उपयोग किया जा रहा है। मैं इस मॉड्यूल के साथ हमारी फ़ंक्शन परिभाषाओं में से कुछ को फिर से बनाना चाह रहा हूं क्योंकि यह मेकटेबल व्यू + गेटकाउंट पद्धति से अधिक लचीला है।


अच्छा राउंडअप। पूर्णता के लिए, मैं जोड़ना चाहूंगा कि 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]
बेरेंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.