¿La forma más rápida de contar la cantidad de entidades en una clase de entidad?

36

Con la introducción del módulo de acceso a datos en arcpy (cursores de búsqueda 30 veces más rápidos), quiero saber si el recuento de características que coinciden con los criterios sql es más rápido que la metodología tradicional MakeTableView + GetCount.

Michael Markieta
fuente
12
Qué estúpido es que el recuento de características no sea solo una propiedad de un arco. Describa el objeto
Grant Humphries
Esto fue bastante fácil con ogrinfo con algunos OGR SQL . El conjunto de datos tiene algo así como 170000 registros, y esta búsqueda con comodines en un VARCHARcampo no indexado volvió en solo unos segundos. ogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
elrobis

Respuestas:

3

He probado la solución de la respuesta anterior y en mis datos del mundo real la diferencia es insignificante. Opuesto a los resultados en otra respuesta, mis tiempos para arcpy.MakeTableView_management y arcpy.da.SearchCursor dentro de ArcMap son los mismos.

He probado variaciones con y sin consulta, consulte el código para la versión de consulta y los resultados finales medidos a continuación:

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

Los resultados a continuación:

    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
Miró
fuente
Bueno, han pasado unos 7 años desde que se respondió la pregunta, ¡así que espero que hayan mejorado su SDK! =) gracias por probarlo tú mismo Miro.
Michael Markieta
47

Estoy usando un ejemplo con 1 millón de puntos generados aleatoriamente dentro de una base de datos de archivos. Adjunto aquí .

Aquí hay un código para comenzar:

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

Y algunos resultados iniciales:

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

Imagine conjuntos de datos más grandes y complejos. El cursor de búsqueda se arrastrará indefinidamente.

No estoy del todo insatisfecho con los resultados, sin embargo, el módulo DataAccess se está utilizando ampliamente en nuestro círculo de desarrollo SIG. Estoy buscando reconstruir algunas de nuestras definiciones de funciones con este módulo, ya que es más flexible que una metodología MakeTableView + GetCount.

Michael Markieta
fuente
Buen resumen. Para completar, me gustaría agregar qué IMO debería ser más rápido, pero de hecho es el método más lento (10 veces más 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