A maneira mais rápida de contar o número de recursos em uma classe de recursos?

35

Com a introdução do módulo Data Access no arcpy (cursores de pesquisa 30x mais rápidos), quero saber se a contagem de recursos que correspondem aos critérios sql é mais rápida que a metodologia tradicional MakeTableView + GetCount?

Michael Markieta
fonte
12
O quão estúpido é que a contagem de recurso não é apenas uma propriedade de um objeto arcpy.Describe
Grant Humphries
Isso foi bem fácil com o ogrinfo com algum OGR SQL . O conjunto de dados tem algo como 170000 registros e essa pesquisa curinga em um VARCHARcampo não indexado voltou em apenas alguns segundos. ogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
elrobis

Respostas:

2

Testei a solução da resposta acima e, nos dados do mundo real, a diferença é insignificante. Ao contrário dos resultados em outra resposta, meus horários para arcpy.MakeTableView_management e arcpy.da.SearchCursor no ArcMap são os mesmos.

Testei variações com e sem consulta. Consulte o código da versão da consulta e os resultados finais medidos abaixo:

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

Os resultados abaixo:

    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
fonte
Bem, já se passaram 7 anos desde que a pergunta foi respondida, então eu espero que eles tenham feito melhorias no SDK !!! =) obrigado por testar você mesmo Miro.
Michael Markieta 5/03
47

Estou usando um exemplo com 1 milhão de pontos gerados aleatoriamente dentro de um banco de dados de arquivos. Anexado aqui .

Aqui está um código para começar:

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 alguns resultados iniciais:

>>> 
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 dados maiores e mais complexos. O SearchCursor irá rastrear indefinidamente.

Não estou nada insatisfeito com os resultados, no entanto, o módulo DataAccess está sendo amplamente utilizado em nosso círculo de desenvolvimento de GIS. Estou procurando reconstruir algumas de nossas definições de funções com este módulo, pois é mais flexível que uma metodologia MakeTableView + GetCount.

Michael Markieta
fonte
Bom ajuntamento. Para completar, gostaria de adicionar o que a IMO deve ser mais rápido, mas é, de fato, o método mais lento (10x mais 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