30 votos

Formas de acelerar los scripts de Python que se ejecutan como herramientas de ArcGIS

Esta es una pregunta bastante general. Me pregunto qué consejos y trucos han utilizado los programadores de GIS para acelerar los scripts de arcpy que se importan a la caja de herramientas y se ejecutan.

Trabajo casi todos los días escribiendo pequeños scripts para ayudar a los usuarios no SIG de mi oficina a procesar datos SIG. He descubierto que el procesamiento de ArcGIS 10.0 en general es más lento que el de 9.3.1 y a veces se vuelve aún más lento cuando se ejecuta un script de python.

Voy a enumerar un ejemplo particular de un script que tarda más de 24 horas en ejecutarse. Es un bucle que tabula el área de un raster en un buffer para cada forma en el buffer. El buffer tiene alrededor de 7000 formas. No creo que deba ejecutarse tanto tiempo. A

while x <= layerRecords:

    arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
    arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x))                                  # Selecting the record
    TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc)                          # Tabulate the area of the single row

    arcpy.AddMessage ("          - Row: " + str(x) + " completed")
    x = x + 1
    z = z + 1

Antes de que alguien lo diga, he ejecutado el área de tabulación en todo el buffer, pero produce errores si se ejecuta en más de 1 registro. Es una herramienta defectuosa, pero tengo que usarla.

De todos modos, si alguien tiene alguna idea sobre cómo optimizar, o acelerar este script, sería muy apreciado. De lo contrario, ¿tienes algún truco de aceleración para python, cuando se utiliza en ArcGIS?

29voto

Margaret Puntos 258

Las técnicas generales de optimización de Python pueden ahorrarle mucho tiempo.

Una técnica muy buena para saber dónde están los retrasos en tu script es utilizar el módulo incorporado cProfile:

from cProfile import run
run("code") # replace code with your code or function

Las pruebas realizadas con una pequeña muestra de datos le permitirán determinar qué llamadas a funciones son las que más tiempo consumen.

Punteros generales para un código python más rápido:

  • Las comprensiones de listas suelen ser más rápidas que los bucles
  • Los generadores producen un elemento a la vez en lugar de producir toda la lista a la vez
  • Usar xrange en lugar de range en python 2 (no es necesario en 3)
  • Los conjuntos pueden superar a las listas cuando se trata de determinar si un elemento está presente en el conjunto, pero suelen ser más lentos que las listas cuando se trata de iterar sobre su contenido Source :
  • Llamadas a la función puede ser costoso para el rendimiento Source :
  • Más consejos y detalles aquí Consejos de rendimiento de Python y aquí 10 consejos y problemas de optimización de Python

Con respecto a su secuencia de comandos, no puedo comentar sobre los aspectos ArcPy como yo no tengo Arc instalado en este equipo, pero es posible que desee tratar de usar un bucle for en lugar de un bucle while ver si eso mejora algo. También x = x + 1 se puede escribir como x+=1:

for record in layerRecords:
arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x))                                  # Selecting the record
TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc)                          # Tabulate the area of the single row

arcpy.AddMessage ("          - Row: " + str(x) + " completed")
x+=1
y+=1

26voto

aditya Puntos 111

Un par de sugerencias potenciales para ayudar a acelerar su proceso son:

  1. Seleccionar capa por atributo puede estar en un script sólo de Python, sin necesidad de lanzar ArcGIS Desktop. Necesita convertir su referencia "buff" de una referencia basada en un archivo a una referencia de "capa de ArcGIS", contra la cual ArcGIS puede procesar consultas de selección. Utilice arcpy.MakeFeatureLayer_management ("buff", "buff_lyr") por encima de tu bucle "while", y luego cambia tus referencias por debajo del bucle "while" para usar "buff_lyr".

  2. Procese la mayor parte de sus operaciones de GP utilizando el espacio de trabajo en memoria como sea posible... Utilice arcpy.CopyFeatures_management(shapefile, "in_memory \memFeatureClass ") para trasladar su fuente a la memoria. Esto sólo funciona bien si tiene suficiente RAM para leer todas las clases de características que necesita en la memoria. Sin embargo, tenga en cuenta que hay algunas operaciones de GP que no pueden ejecutarse utilizando el espacio de trabajo en memoria (por ejemplo, la herramienta de proyecto).

Del artículo de ayuda en línea de ArcGIS 9.3 " Los datos intermedios y el espacio de trabajo de cero "(nota: este lenguaje fue eliminado de la ayuda de las versiones 10.0 y 10.1):

NOTA: Sólo las tablas y las clases de características (puntos, líneas, polígonos) pueden ser escribirse en el espacio de trabajo en memoria. El espacio de trabajo in_memory no soporta elementos extendidos de la geodatabase como subtipos, dominios, representaciones, topologías, redes geométricas y conjuntos de datos de red. Sólo se pueden escribir características y tablas simples.

Del artículo de ayuda en línea de ArcGIS 10.1 " Uso del espacio de trabajo en memoria ":

A la hora de decidir si se escribe la salida, hay que tener en cuenta las siguientes consideraciones en el espacio de trabajo en memoria:

  • Los datos escritos en el espacio de trabajo en memoria son temporales y se borrarán cuando se cierre la aplicación.
  • Las tablas, las clases de características y los rasters pueden escribirse en el espacio de trabajo en memoria.
  • El espacio de trabajo en memoria no admite elementos ampliados de la geodatabase, como subtipos, dominios, representaciones y topologías, redes geométricas y conjuntos de datos de red.
  • No se pueden crear conjuntos de datos o carpetas de características en el espacio de trabajo en memoria.

14voto

idursun Puntos 3648

Asegúrese de que está escribiendo en la unidad interna del ordenador. Llegar a través de la red cuando no es necesario puede ralentizar mucho el proceso. Incluso puede ser más rápido copiar los datos como primer paso del proceso para que las siguientes lecturas-escrituras sean lo más rápidas posible.

Ejecutar el script completamente fuera de ArcMap puede ser mucho más rápido. Si no se requiere un Mapa durante el procesamiento, entonces no use ArcMap.

6voto

John Kramlich Puntos 286

Esto no puede responder a su pregunta para la ejecución de herramientas ArcPy dentro de ArcMap, pero cuando tengo que hacer algo de procesamiento de carne con herramientas de geoprocesamiento y Python tiendo a ejecutar fuera del sistema GIS utilizando el IDE PyScripter . He comprobado que funciona más rápido. También he empleado un RAMDISK para pequeños conjuntos de datos temporales de salida (un poco como el en_memoria espacio de trabajo)

¡Pues son mis mejores consejos! :)

5voto

aitazaz Puntos 107

Prueba a comentar arcpy.S

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X