Reduza o tempo de processamento na função Apagar usando o Arcpy em IDLE

8

Estou processando 18.000 classes de recursos (salvas em um arquivo GDB), cada uma com ~ 500 registros (recursos de polígonos) em áreas oceânicas e estou executando um script para remover a área sobreposta à costa, usando a função Apagar. O script está sendo executado com êxito, mas literalmente leva dias para ser concluído. Alguns arquivos levam alguns segundos para serem processados ​​(suponho que isso se deva ao fato de que eu verifiquei que eles não se sobrepõem ao litoral) enquanto algumas classes de recursos demoram mais de uma hora para serem processadas.

Estou trabalhando localmente na minha máquina, executando o script em IDLE, com o ArcGIS 10.1 (todas as licenças) em um computador com Windows 7 de 32 bits, Intel DuoCore de 3,33 GHz e RAM de 4 GB.

Estou aprendendo as cordas com o Python e gostaria muito de receber dicas sobre o meu script, se houver etapas a serem seguidas para acelerar o tempo de processamento. Obrigado!

# Import modules
import arcpy
import sys
import os
from arcpy import env

arcpy.env.overwriteOutput = True
print arcpy.env.overwriteOutput

#Erase coastline from selected buffers.
workspace = "C:\\DIR\\points_buff\\"
arcpy.env.workspace = workspace
erase_output = workspace+"erased.gdb\\"
erasedirectorypath = "C:\\DIR\\points_buff\\selectedbuff.gdb"
fileList = []

for dirpath, dirnames, erases in arcpy.da.Walk(erasedirectorypath,
                                              datatype="FeatureClass",
                                              type="Polygon"):
    for erase in erases:
        fileList.append(os.path.join(dirpath, erase))
        filenameparts = erase.split('_')
        if int(filenameparts[1]) > int(1967):

            try:
        #Set variables for Erase tool
                in_features = erasedirectorypath+"\\"+erase
                coastline_feat = "C:\\DIR\\Basic_NE.gdb\\Coastline_Eastern_US"
                out_erase_feat = erase_output+erase[:-4]+"_er"
                arcpy.Erase_analysis(in_features, coastline_feat, out_erase_feat, '')
                print arcpy.GetMessages()
                print "Coastline has been erased from " + erase + " and saved to " + erase_output

            except:
                print arcpy.GetMessages()
SharonB
fonte

Respostas:

7

Embora seja difícil solucionar problemas do seu script sem visualizar os dados espaciais, alguns truques e idéias podem ajudar no seu fluxo de trabalho. Para começar, subconecte seu conjunto de dados e experimente diferentes abordagens. Incorpore um relógio de ponto em seu script para ter uma noção real de quão rápidas ou lentas são as operações. Tente agrupar seus comandos com um time.clock. Por exemplo:

import time
StartTime = time.clock()
arcpy.Erase_analysis(in_features, coastline_feat, out_erase_feat, '')
EndTime = time.clock()
print "Erase finished in %s hours" % ((EndTime - StartTime)/3600)
time.sleep(2.5)
  • Tente utilizar o poder do espaço de trabalho in_memory . Geralmente, as operações executadas in_memorysão mais rápidas que as que são gravadas no disco. Use in_memorypara qualquer operação intermediária.

  • Em vez de usar o comando Apagar, use o seguinte conjunto de comandos para executar um fluxo de trabalho semelhante:

Criar camada de recursos (gerenciamento de dados)

Selecionar Camada por Local (Gerenciamento de Dados)

Excluir recursos (gerenciamento de dados)

Recursos de cópia (gerenciamento de dados)

Aaron
fonte
2
O cálculo do tempo pode ser inestimável para comparar métodos, especialmente se você estiver tentando muitas abordagens diferentes em um pequeno subconjunto de dados.
Aaron
2
Sim, lembre-se de que você pode excluir facilmente arquivos in_memory em seu script usando Excluir (Gerenciamento de dados).
Aaron
4
Quantos recursos estão no arquivo de linha de costa e qual é o número típico de vértices em um recurso? Qual o tamanho de uma área que abrange? Qual o tamanho de uma área que suas classes de recursos normalmente cobrem? Se você tiver recursos muito grandes e complicados em seu arquivo de linha de costa, essa pode ser a fonte da desaceleração. Existem alguns métodos a serem usados ​​para ajustar isso, se for o problema.
Blord-castillo
2
Na verdade, eu seguiria a rota oposta. Primeiro, dissolva os recursos e, em seguida, divida o polígono grande em várias classes de recursos separadas de um polígono cada. Tente executar apenas uma dessas classes de recurso de litoral único subconjunto contra uma de suas classes de recurso que demorou um pouco (e cruzou). Veja se isso oferece alguma melhoria. Acho que seus envelopes de interseção podem ser grandes demais, eliminando qualquer ajuste de desempenho já incorporado nas análises de sobreposição.
Blord-castillo
4
Outro fluxo de trabalho para testar. Execute Minimum Bounding Geometryna classe de recurso de destino usando a Opção de Grupo ALLe o tipo de geometria ENVELOPE. Faça uma exclusão na classe de recursos de envelope resultante usando seu litoral enorme. Use essa saída dessa exclusão para fazer uma Clipna sua classe de recurso de destino original. Isso simplifica a etapa complexa, a exclusão e a substitui por um clipe mais barato por um recurso menor.
Blord-castillo