8 votos

Aumentando la velocidad de secuencias de comandos de Python usando arcpy

Actualización 4/11/2014

Parece que el guión fue colgado en la eliminación de las Características de la herramienta, así que me cambié a Truncar la Tabla, como se indicó en la respuesta a continuación. También he eliminado las variables sin usar de la herramienta adjuntar.

Actualización 4/10/2014

Me encontré este script en mi compañero de trabajo del equipo (su máquina tiene más memoria Y contiene ArcGIS 10.0/Python26) y se corrió rápidamente. ¡Hurra! Una vez que el soporte técnico se encuentra el ArcGIS 10.0 CD, voy a instalar y prueba a ver si mejora la velocidad en mi máquina. Para ser claros, estamos ejecutando el mismo guión, nuestra unidad de red y la conexión de base de datos se asignan de forma idéntica, y las instrucciones de impresión son las mismas. Voy a publicar una actualización aquí una vez que eso sucede.

Final actualizaciones

Que necesita para aumentar la velocidad de algunas secuencias de comandos de Python que realizar actualizaciones en una base de datos de Oracle. Tenía estas secuencias de comandos de Python se ejecuta bien por un año+, a través de las tareas programadas y archivos de proceso por lotes para iniciar las secuencias de comandos. La semana pasada me movía de un XP en un equipo con Windows 7 y ArcGIS 10.0 --> 10.1. Desde entonces las secuencias de comandos se han convertido en terriblemente lento. Si puedo ejecutar esta secuencia de comandos mediante una pequeña clase de entidad (que contiene ~20 características) que se ejecuta en 30 segundos. Si yo uso un medio de clase de entidad (~80.000 registros) que se ejecuta en 15 minutos. La clase de entidad que realmente necesita para ser capaz de transferir rápidamente contiene alrededor de 1.000.000 de registros - la secuencia de comandos sólo va tan lejos como la instrucción print para comprobar si existen los archivos (si la instrucción en el código de abajo). Este proceso llevaría a solo 35 minutos para completar en mi XP/ArcGIS 10.0 máquina.

A continuación es la versión simplificada de código que he estado probando. ¿Alguien tiene sugerencias sobre lo que puede hacer para aumentar la velocidad? Gracias, Patty

import arcpy, os, sys
from arcpy import env
arcpy.env.overwriteOutput = True
from datetime import datetime
import smtplib
import string
import urllib

#Define variables
inWorkspace = "O:/LANDING_PAD/BOE/example.gdb" 
lpFeatures = inWorkspace + os.sep + "fc1"
outWorkspace =  "Database Connections\\THIS.sde"
arcpy.env.workspace = outWorkspace
workspace = ""
copyFC = outWorkspace + os.sep + "SDE.fc1_1" #The feature class the script will update via delete and append
schema_type = "NO_TEST"
fieldMappings = ""
subtype = ""
t = datetime.now()
print "This script began at: " + str(t)

if arcpy.Exists(lpFeatures) is True and arcpy.Exists(copyFC) is True:
    print "Both files exist. Beginning delete..."
    arcpy.DeleteFeatures_management(copyFC) #(copyFC)

    print "ALL DONE DELETING!"

    arcpy.Append_management(lpFeatures, copyFC, schema_type, fieldMappings, subtype) #Append data from landing pad to db
    print "ALL DONE APPENDING!"
    record_count = arcpy.GetCount_management(lpFeatures)
    print record_count
    r = datetime.now()
    print "This script ended at: " + str(r)

7voto

Alex Tereshenkov Puntos 13433

He querido comentar primero, pero luego se parecía más apropiado para envolver a ser una respuesta (aunque sea incompleta).

He de ejecutar su código en mi máquina (parte superior de hardware portátil con SSD) anexar un archivo de clase de entidad de geodatabase a un Servidor SQL server clase de entidad de geodatabase en la misma máquina que me tomó alrededor de 13 min. No puedo decir con certeza por qué la velocidad de ejecución difiere mucho en su entorno (10.0 >> 10.1), sino que has pedido para sugerencias sobre lo que usted puede hacer para aumentar la velocidad, así que aquí están algunas ideas de lo que podría aumentar la velocidad de ejecución del script.

1) ejecute la secuencia de comandos desde la línea de comandos que es equivalente a ejecutar un .archivo bat (ejecute la secuencia de comandos en la versión de 64 bits de sabor, he ArcGISx6410.2 64bit Python instalado).

c:\Python27\ArcGISx6410.2\python.exe c:\scripts\appendfc.py

Desde mi experiencia, que es generalmente más rápido para ejecutar la versión de 64 bits de Python para ejecutar largo y pesado GP de operaciones como Anexar. Así que usted quiere asegurarse de que usted ejecute esta versión de Python cuando se ejecuta la secuencia de comandos.

2) yo no recomendaría el uso de arcpy.DeleteFeatures_management; es mucho más lenta que la ejecución Truncate Table desde el segundo uno no uso de transacciones de base de datos que mejora el rendimiento en fila por fila eliminación.

Usted mencionó que el script sólo va tan lejos como la instrucción print para comprobar si existen los archivos (si la instrucción en el código). Hay una buena probabilidad de que se mantiene la eliminación de fila por fila, que puede ser un proceso muy lento cuando usted accede a una tabla en Oracle remoto (o en realidad cualquier DBMS) de la base de datos. Intente ejecutar el script con Truncate Table, pero sin Anexar en primer lugar, para ver la diferencia de rendimiento en la eliminación de la etapa.

3) parece ser el uso de "Database Connections\\THIS.sde" en el código. Sin embargo, es preferible que consulte el archivo de conexión de sí mismo (.sde archivo) con el sistema de archivo o ruta de acceso UNC, no en la ventana de Catálogo "Conexiones de Base de datos" carpeta. Usted puede tener acceso a el .sde archivo creado en C:\Users\%user%\AppData\Roaming\ESRI\Desktop10.1\ArcCatalog. Puede mover este .sde archivo de alrededor como usted necesita y las coloca en la carpeta de la secuencia de comandos de Python tendrá acceso.

4) En la arcpy.Append_management función, utilice un par de vacío parámetros. En teoría, no debería hacer ninguna diferencia, pero yo sugeriría que se ejecuta la función sin especificar los parámetros sólo porque usted no los necesita. Nunca se sabe lo que está pasando detrás de las escenas, y si las cadenas vacías son evaluados en algún momento y si esto puede afectar al rendimiento. Sólo tienes que ir con arcpy.Append_management(lpFeatures, copyFC, schema_type) y no especifica los parámetros para los que no se proporciona ningún valor.

5) me desalientan el uso de os.sep cuando la construcción de una ruta de acceso a una clase de entidad. Uso os.path.join(geodatabase,featureclassname) de ese lugar. Es sólo más limpio y legible.

Usted puede agregar más detalles a la pregunta después de haber intentado las cosas de arriba y había algunas pruebas y revisión de código.

Un par de buenas preguntas para leer para obtener más información sobre cómo acelerar la velocidad de las secuencias de comandos de Python en ArcGIS:

El rendimiento de ArcGISScripting y grandes conjuntos de datos espaciales

Fondo de Geoprocesamiento (64-bit)

Arcgis CopyFeatures herramienta extremadamente lento cuando se exporta a SDE

Maneras de acelerar secuencias de comandos de Python que se Ejecuta Como Herramientas de ArcGIS

Consideraciones de geoprocesamiento de datos de ArcSDE

1voto

Derek Schrock Puntos 131

Espero que este ejemplo te ayude a responder a la pregunta demasiado y es en el software más reciente. Se basa en las respuestas y comentarios de los mencionados anteriormente.

Programa de instalación:

  1. Windows 7
  2. SQL Server 2012 R2
  3. ArcGIS 10.2.2 (de Servidor y de Escritorio)

La carga necesaria para estar por la noche. Fue ~9300 registros y 234 atributos.

El modelo original fue abajo y se hace todo en SQL Server 2012 R2/SDE (7 minutos a través de ArcCatalog y 3 horas con python):

  1. Eliminar Filas de la Clase de entidad en SDE
  2. Hacer XY evento de la Capa de la tabla en SQL Server
  3. Anexar a la Clase de entidad en SDE

Cómo me alteración de la era (10 segundos a través de ArcCatalog y 10 segundos a través de python): •

  1. Sustituido eliminar filas herramienta con Truncar la herramienta SIG para la clase de entidad en SDE
  2. Exportar la Tabla de SQL a un FGDB en el local de la Unidad C
  3. Hacer XY Evento de la Capa en la memoria local
  4. Clase de entidad a Clase de entidad dentro de FGDB en el Local de la unidad C
  5. A CONTINUACIÓN, agregar FGDB clase de entidad en SDE
  6. Tenga en cuenta que mi base de datos SQL Server se encuentra en la misma unidad C como a mi FGDB. Puede que un poco más lento a través de una red, pero aún más probable no a las 3 horas me estaba viendo.

¿Qué ayudar un poco en el modelo original fue la sustitución de las fuentes de datos como por #3 se recomienda más arriba. Se afeitó 30 segundos cuando se ejecuta en ArcCatalog. Con python se afeitó unos 20 minutos. Por lo tanto es una variable en la velocidad, pero no es el más valioso de la variable de dirección en mi caso. Parece que según la mayoría de los blogs de SQL Server no se como pesada carga de datos "de la memoria" (es decir, hacer xy evento capa). SQL/SDE parece preferir un objeto real de la carga. Esto explica por qué mis otras cargas hago de la misma manera tomar de 1 minuto, pero esos son sólo 1000 registros con 15 atributos por lo que nunca he cuestionado la eficacia de mis modelos hasta esta carga a realizarse por la noche. Como se mencionó esta carga es de 9000 registros con 236 atributos.

0voto

Baran Puntos 1

El problema con el rendimiento entre 10.0 y 10.1 es algo en el SDE las bibliotecas fue cambiado en el escritorio. Hemos utilizado para publicar 1.000.000 de noche y tomó a sólo 45 minutos, después de una actualización de software, se tardó casi 24 horas. Obviamente no hay ningún problema con los datos, y sólo el software fue cambiado.

Comprobar la versión de la geodatabase para asegurarse de que coincide con la versión del cliente que se ejecuta arcpy. Nos informó de esto a ESRI, sin respuesta o el reconocimiento de un error. Es bastante obvio y el problema comenzó después de 10.0 SP1.

También otra prueba de un copiar/pegar es más rápido que un anexar probar este de 10.0 y 10.1 y el rendimiento debe ser similar. Esto demuestra que existe algún tipo de error va a versiones anteriores cuando anexar geometrías.

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