Resultados incomuns para testes de velocidade de geoprocessamento

9

Eu tenho observado desempenho incomum com um script de geoprocessamento Python. O script (anexado) executa as seguintes ações:

  1. Use um cursor de pesquisa para procurar a zona UTM correspondente aos recursos de polígono
  2. Criar objeto de referência espacial com base nos resultados do cursor de pesquisa
  3. Converter .csv na camada de recurso e, em seguida, em uma classe de recurso de ponto

Percebi tempos de processamento marcadamente diferentes, com base em como o script é executado:

  • Processamento de 32 bits usando IDLE = 203 segundos
  • Ferramenta de script de primeiro plano de processamento de 32 bits = 91 segundos
  • Ferramenta de script em segundo plano de processamento de 64 bits = 206 segundos

Por que esse script teria um desempenho tão diferente, dadas as condições acima? Eu certamente não esperaria que a ferramenta de script de 32 bits executada em primeiro plano fosse 2X mais rápida que os outros métodos.


import arcpy, os, time

###IDLE Parameters
##fc = r'C:\path\to\polygon\fc\with\utm\zones\and\features'
##outws = r'C:\out\location'
##arcpy.env.workspace = r'C:\workspace'

####################
## Script tool parameters
fc = arcpy.GetParameterAsText(0)    # Feature class
outws = arcpy.GetParameterAsText(1) # Folder
arcpy.env.workspace = arcpy.GetParameterAsText(2)   # Workspace
####################

# Tables are .csv
tables = arcpy.ListTables()

start = time.clock()

# Look up which UTM zone .csv features are in
for t in tables:
    quad = t[7:17]
    print quad
    whereClause = """ "QUADID" LIKE '%s' """ % quad
    with arcpy.da.SearchCursor(fc, ("QUADID","ZONE"), whereClause) as cursor:
        for row in cursor:
            if row[0] == quad:
                utmZone = row[1]
                if utmZone == 10:
                    sr = arcpy.SpatialReference(26910)  # NAD_1983_UTM_Zone_10N
                elif utmZone == 11:
                    sr = arcpy.SpatialReference(26911)  # NAD_1983_UTM_Zone_11N
                elif utmZone == 12:
                    sr = arcpy.SpatialReference(26912)  # NAD_1983_UTM_Zone_12N
                elif utmZone == 13:
                    sr = arcpy.SpatialReference(26913)   # NAD_1983_UTM_Zone_13N
                else:
                    print "The UTM Zone is outside 10-13"
            else:
                pass

    # Convert .csv to feature class
    try:
        outLayer = "in_memory"
        # Now with the sr defined, create the XY Event Layer
        arcpy.MakeXYEventLayer_management(t, "x", "y", outLayer, sr, "z")
        arcpy.FeatureClassToFeatureClass_conversion(outLayer, outws, t[7:17])
        arcpy.Delete_management("in_memory")
        end = time.clock()
        print "In_memory method finished in %s seconds" % (end - start)

    except:
        # Print any error messages
        print arcpy.GetMessages(2)

print "Processing complete"
Aaron
fonte
11
Quanto tempo leva para importar o arcpy por si só? Existe um erro de formatação na postagem. A tentativa deve: estar dentro do loop for?
Nathan W
2
Acho que import arcpyvale a pena considerar o argumento de @ NathanW primeiro, porque parece que o tempo é necessário apenas pelas rotas IDLE e 64 bits de seus três testes, mas adicionar quase dois minutos parece excessivo. Tente executar uma ferramenta que não faz nada além de importar a ArcPy.
PolyGeo
3
Eu seria muito seguro dizer que é a import arcpylinha. A última vez que usei o arcpy demorou a importar do exterior. O ArcGIS já teria importado em seu Python interno para que a importação já esteja em cache.
197 Nathan W
3
@ Nathan e outros estão absolutamente corretos. A execução de um processo via IDLE ou pela linha de comando é afetada quando você chama 'import arcpy'. No entanto, você pode obter uma compensação por processos muito grandes, onde obtém o tempo de retorno através de um desempenho aprimorado. A execução de um processo em segundo plano também é atingida, pois o ArcGIS efetivamente inicia outra sessão do ArcMap. Por fim, você também tem outras variáveis ​​que precisa eliminar em sua avaliação, como quais são as diferenças de hardware entre suas máquinas de 32 e 64 bits e que outros processos estavam consumindo recursos durante sua avaliação, etc?
MappaGnosis
2
+1 @JayLaura. Poderia ir mais longe e perfil. [ General python doc] [ docs.python.org/2/library/profile.html] e [ stackexchange posting] [ stackoverflow.com/questions/582336/… .
Roland

Respostas:

6

Eu tenho uma teoria

Estou pensando que o problema pode ser a validação da sua saída ou da sua entrada. Antes de uma ferramenta GP ser executada, o arcpy valida parâmetros, por exemplo, se a classe do recurso de saída já existe.

No ArcMap, o conteúdo da área de trabalho (pasta) é todo armazenado em cache e a validação pode ser feita com base na "visualização" do catálogo da área de trabalho - na memória - rapidamente. Isso pode causar confusão se os conjuntos de dados forem adicionados usando uma ferramenta que não seja do ArcGIS, exigindo a execução de um arcpy.RefreshCatalog () para sincronizar a exibição do catálogo com o estado do espaço de trabalho (pasta).

Se sua pasta é muito grande e você está executando fora do ArcGIS, o arcpy pode estar tendo que gerar uma lista de pastas a cada vez para validar sua saída do FeatureClassToFeatureClass. Se houver muitos itens na pasta, isso pode ficar muito lento.

Preço de Curtis
fonte