Formas de acelerar los scripts de Python ejecutándose como herramientas de ArcGIS [cerrado]

30

Esta es una pregunta bastante general. Solo me pregunto qué consejos y trucos han usado los programadores de GIS para acelerar los scripts arcpy que importas a la caja de herramientas y ejecutas.

Trabajo la mayoría de los días escribiendo pequeños scripts para ayudar a los usuarios que no son SIG en mi oficina a procesar datos SIG. Descubrí que el procesamiento de ArcGIS 10.0 en general es más lento que 9.3.1 y, a veces, se vuelve 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 ráster en un búfer para cada forma en el búfer. El buffer tiene alrededor de 7000 formas. No creo que deba durar 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 búfer, 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, ¿tiene trucos de aceleración para python cuando se utiliza en ArcGIS?

    
pregunta Cody Brown 17.08.2012 - 21:36

6 respuestas

25

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

  1. Select Layer By Attribute puede estar en un script solo para Python, sin tener que iniciar ArcGIS Desktop. Debe convertir su referencia "buff" de una referencia basada en archivos a una referencia de "capa ArcGIS", contra la cual ArcGIS puede procesar las consultas de selección. Utilice arcpy.MakeFeatureLayer_management ("buff", "buff_lyr") arriba haga clic en su bucle "while", y luego cambie sus referencias debajo del bucle while para usar "buff_lyr".

  2. Procese la mayor parte de sus operaciones de GP usando in_memory workspace como sea posible ... Use arcpy.CopyFeatures_management (shapefile, "in_memory \ memFeatureClass") para mover su fuente a la memoria. Esto solo funciona bien si tiene suficiente RAM para leer todas las clases de funciones 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 Proyecto).

Del artículo de ayuda en línea de ArcGIS 9.3 " Datos intermedios y el espacio de trabajo scratch " (nota, este idioma se eliminó de la ayuda de 10.0 & 10.1):

  

NOTA: solo las tablas y las clases de entidad (puntos, líneas, polígonos) pueden ser   escrito en el espacio de trabajo in_memory. El espacio de trabajo in_memory no   admite elementos de geodatabase extendida como subtipos, dominios,   Representaciones, topologías, redes geométricas y datasets de red.   Solo se pueden escribir tablas y características simples.

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

  

Las siguientes consideraciones deben hacerse al decidir escribir la salida   al espacio de trabajo en memoria:

     
  • Los datos escritos en el espacio de trabajo en memoria son temporales y se eliminarán cuando se cierre la aplicación.
  •   
  • Las tablas, las clases de entidad y los rásteres se pueden escribir en el espacio de trabajo en memoria.
  •   
  • El espacio de trabajo en memoria no admite elementos de geodatabase extendida como subtipos, dominios, representaciones, topologías,   redes geométricas y conjuntos de datos de red.
  •   
  • Los conjuntos de datos o carpetas de entidades no se pueden crear en el espacio de trabajo en memoria.
  •   
    
respondido por el RyanDalton 20.08.2012 - 17:07
28

Las técnicas generales de optimización de python pueden ahorrarle una cantidad considerable de tiempo.

Una técnica realmente buena para obtener información sobre dónde se encuentran las detenciones en su script es mediante el módulo cProfile incorporado:

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

Las pruebas con una pequeña muestra de datos te permitirán identificar qué función están tomando más tiempo.

Indicadores generales para un código de Python más rápido:

  • Las comprensiones de listas son generalmente más rápidas que los ciclos
  • Los generadores producen un elemento a la vez en lugar de generar toda la lista a la vez
  • Use xrange en lugar de rango en python 2 (no es necesario en 3)
  • Los conjuntos pueden eliminar las listas de preformas cuando se trata de determinar si un elemento está presente en el conjunto, pero en general son más lentos que las listas cuando se trata de iterar sobre su contenido Source
  • Las llamadas a funciones pueden ser costosas 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 script, no puedo comentar sobre los aspectos de ArcPy ya que no tengo Arc instalado en esta computadora, pero es posible que desee intentar usar un bucle for en lugar de un bucle while para 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
    
respondido por el James Milner 18.08.2012 - 16:47
13

Asegúrese de que está escribiendo en la unidad interna de la computadora. Llegar a través de la red cuando no es necesario puede realmente retardar el procesamiento. Incluso puede ser más rápido copiar los datos como el primer paso en el proceso para mantener las lecturas y escrituras posteriores lo más rápido 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.

    
respondido por el mhoran_psprep 18.08.2012 - 06:43
6

Es posible que esto no responda a su pregunta sobre la ejecución de las herramientas de ArcPy dentro de ArcMap, pero cuando necesito realizar un procesamiento carnoso con herramientas de procesamiento geográfico y Python, tiendo a ejecutarlo fuera del sistema GIS utilizando el IDE PyScripter . He encontrado que corre más rápido. También he empleado un RAMDISK para pequeños conjuntos de datos de salida temporales (un poco como in_memory espacio de trabajo)

Bueno, son mis mejores consejos! :)

    
respondido por el Hornbydd 17.08.2012 - 23:56
5

Intenta comentar fuera de arcpy.SetProgressorLabel y observa cuánto aceleras. Descubrí que cualquier salida de pantalla, volviendo a aturdir a DOS, reduce drásticamente los tiempos de procesamiento. Si realmente necesita ver esa salida, intente mostrarla en cada Nth loop.

    
respondido por el user30749 28.05.2014 - 22:36
4

Asegúrate de eliminar cualquier línea import xxxx que no se esté utilizando.

(es decir, si no estás utilizando ninguna función matemática pero tienes import Math , esto llevará un tiempo desde la carga del script)

Aunque esto no tendrá un gran impacto en los scripts individuales que se ejecutan (como el suyo), afectará a cualquier script que se ejecute con frecuencia y de manera repetitiva.

    
respondido por el nagytech 18.08.2012 - 01:52

Lea otras preguntas en las etiquetas