Esta es una pregunta bastante general. Me pregunto qué consejos y trucos han utilizado los programadores de SIG para acelerar los scripts arcpy que importas a la caja de herramientas y ejecutas.
Trabajo casi todos los días escribiendo pequeños scripts para ayudar a los usuarios que no son SIG en mi oficina a procesar datos SIG. He descubierto que el procesamiento de ArcGIS 10.0 en general es más lento que 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 ráster en un búfer para cada forma en el búfer. El búfer tiene aproximadamente 7000 formas. No creo que deba durar tanto. UNA
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, ejecuté 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 algún truco para acelerar Python cuando se usa en ArcGIS?
fuente
Las técnicas generales de optimización de Python pueden ahorrarle una cantidad considerable de tiempo.
Una técnica realmente buena para obtener un resumen de dónde están las retenciones en su script es usar el módulo cProfile incorporado:
La prueba con una pequeña muestra de datos le permitirá determinar qué llamadas de función están tomando más tiempo.
Punteros generales para un código python más rápido:
Con respecto a su secuencia de comandos, 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:
fuente
Asegúrese de escribir en la unidad interna de la computadora. Llegar a través de la red cuando no es necesario realmente puede retrasar 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, no use ArcMap.
fuente
Calculate Value
cuadro de diálogo) se procesará más rápido que ejecutar el mismo script desde la ventana ArcPy en ArcMap. Sin embargo, eso es puramente una observación anecdótica.Es posible que esto no responda a su pregunta para ejecutar las herramientas de ArcPy dentro de ArcMap, pero cuando necesito hacer un procesamiento con mucha carne con herramientas de procesamiento geográfico y Python, tiendo a ejecutarlo fuera del sistema SIG 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 el espacio de trabajo in_memory )
Bueno, ellos son mis mejores consejos! :)
fuente
Intente comentar arcpy.SetProgressorLabel y vea cuánto acelera. Descubrí que cualquier salida de pantalla, volviendo al aturdimiento de DOS, ralentiza drásticamente los tiempos de procesamiento. Si realmente necesita ver esa salida, intente mostrarla en cada enésimo bucle.
fuente
Asegúrese de eliminar cualquier
import xxxx
línea que no se esté utilizando.(es decir, si no está utilizando ninguna función matemática todavía tiene
import Math
, esto llevará algún tiempo desde la carga del script)Aunque esto no tendrá un gran impacto en las secuencias de comandos individuales que se ejecutan (como la suya), afectará a las secuencias de comandos que se ejecutan con frecuencia y de forma repetitiva.
fuente
import Math
fue probablemente un mal ejemplo. Sin embargo, algunas de las bibliotecas ArcPy más grandes tardan una cantidad considerable de tiempo en cargarse.