Le moyen le plus rapide de compter le nombre d'entités dans une classe d'entités?

36

Avec l'introduction du module d'accès aux données dans arcpy (curseurs de recherche 30 fois plus rapides), je souhaite savoir si le comptage des entités correspondant aux critères SQL est plus rapide que la méthodologie traditionnelle MakeTableView + GetCount?

Michael Markieta
la source
12
Comment stupide est-ce que le nombre de fonctionnalités n'est pas simplement la propriété d'un objet arcpy.Describe
Grant Humphries
C'était assez facile avec ogrinfo avec du SQL OGR . Le jeu de données contient environ 170000 enregistrements et cette recherche générique sur un VARCHARchamp non indexé est revenue en quelques secondes. ogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
Elrobis

Réponses:

3

J'ai testé la solution de la réponse ci - dessus et sur mes données réelles, la différence est négligeable. Contrairement aux résultats obtenus avec une autre réponse, mes temps pour arcpy.MakeTableView_management et arcpy.da.SearchCursor dans ArcMap sont identiques.

J'ai testé les variantes avec et sans requête, veuillez consulter le code de la version de la requête et les résultats finaux mesurés ci-dessous:

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

Les résultats ci-dessous:

    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
la source
Eh bien, cela fait environ 7 ans que la question a été répondue alors j'espère qu'ils ont apporté des améliorations à leur SDK !!! =) merci de le tester vous-même Miro.
Michael Markieta
47

J'utilise un exemple avec 1 million de points générés aléatoirement à l'intérieur d'une base de données de fichiers. Attaché ici .

Voici quelques codes pour nous aider à démarrer:

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

Et quelques premiers résultats:

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

Imaginez des ensembles de données plus vastes et plus complexes. Le SearchCursor va explorer indéfiniment.

Je ne suis pas du tout insatisfait des résultats, cependant, le module DataAccess est largement utilisé dans notre cercle de développement SIG. Je cherche à reconstruire certaines de nos définitions de fonction avec ce module car il est plus flexible qu'une méthodologie MakeTableView + GetCount.

Michael Markieta
la source
Belle rafle. Par souci d'exhaustivité, j'aimerais ajouter ce que l'OMI devrait être le plus rapide, mais c'est en fait la méthode la plus lente (10 fois plus lente). 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