Il modo più veloce per contare il numero di funzioni in una classe di caratteristiche?


36

Con l'introduzione del modulo di accesso ai dati in arcpy (cursori di ricerca 30 volte più veloci), voglio sapere se il conteggio delle funzionalità che soddisfano i criteri sql è più veloce della tradizionale metodologia MakeTableView + GetCount?


12
Com'è stupido che il conteggio delle caratteristiche non sia solo una proprietà di un arcipy. Descrivi un oggetto
Grant Humphries,

Questo è stato abbastanza facile con ogrinfo con alcuni OGR SQL . Il set di dati ha qualcosa come 170000 record e questa ricerca jolly su un VARCHARcampo non indicizzato è tornata in pochi secondi. ogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
elrobis,

Risposte:


3

Ho testato la soluzione dalla risposta sopra e sui miei dati del mondo reale la differenza è trascurabile. Di fronte ai risultati in un'altra risposta, i miei tempi per arcpy.MakeTableView_management e arcpy.da.SearchCursor in ArcMap sono gli stessi.

Ho testato le variazioni con e senza query, consultare il codice per la versione della query e i risultati finali misurati di seguito:

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

I risultati seguenti:

    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

Bene, sono passati circa 7 anni dalla risposta alla domanda, quindi spero che abbiano apportato miglioramenti al loro SDK !!! =) grazie per averlo testato tu stesso Mirò.
Michael Markieta,

47

Sto usando un esempio con 1 milione di punti generati casualmente all'interno di un filegeodatabase. Qui allegato .

Ecco un po 'di codice per iniziare:

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

E alcuni risultati iniziali:

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

Immagina set di dati più grandi e complessi. SearchCursor eseguirà la scansione indefinitamente.

Non sono affatto insoddisfatto dei risultati, tuttavia, il modulo DataAccess viene ampiamente utilizzato nel nostro circolo di sviluppo GIS. Sto cercando di ricostruire alcune delle nostre definizioni delle funzioni con questo modulo in quanto è più flessibile di una metodologia MakeTableView + GetCount.


Bella carrellata. Per completezza, vorrei aggiungere ciò che IMO dovrebbe essere più veloce, ma in realtà è il metodo più lento (10 volte più lento). 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,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.