Der schnellste Weg, um die Anzahl der Features in einer Feature-Class zu zählen?

35

Mit der Einführung des Datenzugriffsmoduls in arcpy (30-mal schnellerer Suchcursor) möchte ich wissen, ob das Zählen von Features, die mit SQL-Kriterien übereinstimmen, schneller ist als die herkömmliche Methode MakeTableView + GetCount.

Michael Markieta
quelle
12
Wie dumm ist es, dass die Feature-Anzahl nicht nur eine Eigenschaft eines arcpy ist. Beschreibe Objekt
Grant Humphries
Mit OGR-SQL war dies mit OGR- Info ziemlich einfach . Der Datensatz hat ungefähr 170000 Datensätze, und diese Platzhaltersuche in einem nicht indizierten VARCHARFeld kam innerhalb weniger Sekunden zurück. ogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
Elrobis

Antworten:

2

Ich habe die Lösung aus der obigen Antwort getestet und bei meinen realen Daten ist der Unterschied vernachlässigbar. Im Gegensatz zu Ergebnissen in anderen Antworten stimmen meine Zeiten für arcpy.MakeTableView_management und arcpy.da.SearchCursor in ArcMap überein.

Ich habe Variationen mit und ohne Abfrage getestet. Die Abfrageversion und die endgültigen Messergebnisse finden Sie unten im Code:

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

Die Ergebnisse unten:

    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
Miro
quelle
Nun, es ist ungefähr 7 Jahre her, seit die Frage beantwortet wurde, also würde ich hoffen, dass sie Verbesserungen an ihrem SDK vorgenommen haben !!! =) danke, dass du es selbst getestet hast Miro.
Michael Markieta
47

Ich verwende ein Beispiel mit 1 Million zufällig generierten Punkten in einer Dateidatenbank. In festen Händen hier .

Hier ist ein Code, der uns den Einstieg erleichtert:

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

Und ein paar erste Ergebnisse:

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

Stellen Sie sich größere, komplexere Datensätze vor. Der SearchCursor wird auf unbestimmte Zeit gecrawlt.

Ich bin mit den Ergebnissen überhaupt nicht unzufrieden, aber das DataAccess-Modul wird in unserem GIS-Entwicklungskreis häufig verwendet. Ich versuche, einige unserer Funktionsdefinitionen mit diesem Modul neu zu erstellen, da es flexibler ist als eine MakeTableView + GetCount-Methode.

Michael Markieta
quelle
Schöne Zusammenfassung. Der Vollständigkeit halber möchte ich hinzufügen, was IMO am schnellsten sein sollte, aber tatsächlich die langsamste Methode ist (10x langsamer). 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