Reduzca el tiempo de procesamiento en la función Borrar con Arcpy en IDLE

8

Estoy procesando 18,000 clases de entidad (guardadas en un archivo GDB), cada una con ~ 500 registros (entidades de polígono) en áreas oceánicas, y estoy ejecutando un script para eliminar el área que se superpone con la costa, usando la función Borrar. El script se ejecuta con éxito, pero literalmente tarda días en completarse. Algunos archivos tardan segundos en procesarse (supongo que esto se debe al hecho, que he verificado, de que no se superponen con la costa), mientras que algunas clases de entidad tardan más de una hora en procesarse.

Estoy trabajando localmente en mi máquina, ejecutando el script en IDLE, con ArcGIS 10.1 (todas las licencias) en una computadora con Windows 7 de 32 bits, Intel DuoCore de 3.33 GHz, 4 GB de RAM.

Estoy aprendiendo las cuerdas con Python y realmente agradecería consejos sobre mi script si hay pasos que puedo seguir para acelerar el tiempo de procesamiento. ¡Gracias!

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

Respuestas:

7

Aunque es difícil solucionar problemas de su script sin ver los datos espaciales, algunos trucos e ideas pueden ayudar a su flujo de trabajo. Para comenzar, configure su conjunto de datos y experimente con diferentes enfoques. Incorpora un reloj de tiempo en tu script para tener una idea real de lo rápido o lento que son las operaciones. Intenta envolver tus comandos con a time.clock. Por ejemplo:

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)
  • Intente utilizar el poder del espacio de trabajo in_memory . En general, las operaciones realizadas in_memoryson más rápidas que las que se escriben en el disco. Úselo in_memorypara cualquier operación intermedia.

  • En lugar de usar el comando Borrar, use el siguiente conjunto de comandos para realizar un flujo de trabajo similar:

Crear capa de características (gestión de datos)

Seleccionar capa por ubicación (gestión de datos)

Eliminar características (gestión de datos)

Funciones de copia (gestión de datos)

Aaron
fuente
2
Calcular el tiempo puede ser invaluable para comparar métodos, especialmente si está intentando muchos enfoques diferentes en un pequeño subconjunto de datos.
Aaron
2
Sí, tenga en cuenta que puede eliminar fácilmente archivos in_memory dentro de su secuencia de comandos mediante Eliminar (Administración de datos).
Aaron
44
¿Cuántas entidades hay en el archivo de línea costera y cuál es el número típico de vértices en una entidad? ¿Qué tamaño de área cubre? ¿Qué tamaño de área cubren sus clases de entidad? Si tiene características muy grandes y complicadas en su archivo de línea costera, esa podría ser la fuente de la desaceleración. Hay algunos métodos a utilizar para ajustar eso si es el problema.
blord-castillo
2
De hecho, iría por la ruta opuesta. Primero disuelva las entidades, luego divida el polígono grande en varias clases de entidades separadas de un polígono cada una. Intente ejecutar solo una de estas clases de entidad de costas de entidades únicas subconjustadas en una de sus clases de entidades que tardó un tiempo (e intersectó). Vea si eso le da alguna mejora. Creo que sus sobres de intersección podrían ser simplemente demasiado grandes, eliminando cualquiera de los ajustes de rendimiento ya incorporados en los análisis de superposición.
blord-castillo
44
Otro flujo de trabajo para probar. Ejecute Minimum Bounding Geometryen su clase de entidad de destino utilizando la Opción de grupo ALLy el tipo de geometría ENVELOPE. Realice un borrado en la clase de entidad de envolvente resultante utilizando su enorme línea costera. Use esa salida de ese borrado para hacer un Clipen su clase de entidad de destino original. Esto simplifica el paso complejo, el borrado y lo sustituye por un Clip menos costoso en lugar de una característica más pequeña.
blord-castillo