¿Alguien ha estudiado la diferencia en la ejecución de un script de Python en ArcToolbox frente a un script independiente? Tuve que escribir un script rápido y sucio para convertir un conjunto de imágenes RGB en una sola banda extrayendo la banda 1. Como un script independiente que lee y escribe en mi PC, procesa 1000 imágenes de tamaño idéntico en aproximadamente 350 segundos. Ejecutar el mismo script desde ArcToolbox toma aproximadamente 1250 segundos.
import arcpy
import csv
from os import path
arcpy.env.workspace = in_folder
image_list = arcpy.ListRasters()
#Create a CSV file for timing output
with open(outfile, 'wb') as c:
cw = csv.writer(c)
cw.writerow(['tile_name', 'finish_time'])
#Start the timer at 0
start_time = time.clock()
for image in image_list:
#Extract band 1 to create a new single-band raster
arcpy.CopyRaster_management(path.join(image, 'Band_1'), path.join(out_folder, image))
cw.writerow([image, time.clock()])
Agregué un código para rastrear cuando cada mosaico termina de procesarse y exportar los resultados como un CSV. La conversión del tiempo de finalización al tiempo de procesamiento ocurre en Excel. Graficando los resultados, el tiempo de procesamiento es aproximadamente el mismo para cada mosaico que un script, pero el tiempo de procesamiento aumenta linealmente cuando se ejecuta como una herramienta ArcGIS.
Si las lecturas y escrituras de datos son para un dispositivo de red, el aumento parece ser exponencial.
No estoy buscando formas alternativas de lograr esta tarea en particular. Quiero entender por qué el rendimiento de este script se degrada con el tiempo cuando se ejecuta como una herramienta ArcGIS , pero no como un script independiente. También he notado este comportamiento con otros scripts.
Respuestas:
Esta es mi opinión sobre las cosas: ejecutar un script desde ArcToolbox incurre en todo tipo de costos ocultos a medida que las herramientas intentan interactuar / actualizar la aplicación principal (ArcMap). Todas las herramientas actualizarán los metadatos, algunos intentan actualizar la ventana del mapa y el MXD está grabando cada herramienta que ejecuta en el panel de historial de geoprocesamiento. Ninguno de estos impactos ocultos ocurre cuando se ejecuta en un IDE.
Entonces, ejecutar un bucle solo 1000 veces significa que el MXD está almacenando 1000 registros. Como ArcMap es un software patentado cerrado, no tenemos idea de cómo está funcionando la mecánica de registro de los registros de procesamiento y puede ser el paso limitante de la velocidad.
Otro problema sería que ArcMap es una aplicación impulsada por eventos, las cosas suceden cuando ocurren eventos, desplaza el mapa y el mapa se actualiza, agrega datos y se activa un botón. Supongo que es posible que las herramientas estén activando todo tipo de eventos y que la aplicación se vea "abrumada" por ellas cuando las herramientas se usan de manera repetitiva, pero ¿eso es lo que estoy especulando?
Creo que uno tiene que subir los pros y los contras, exponer un script como herramienta de script hace que sea fácil de usar en el entorno de ArcMap, especialmente para usuarios no expertos. Esa es una cuestión importante si desea que se adopte su código. Números duros crujientes solo por usted sin la necesidad de hacer ningún control de calidad intermedio y luego ejecute el script en su IDE preferido.
fuente