4 votos

ArcPy problemas de rendimiento con una UpdateCursor a la hora de ordenar

Estoy esperando que alguien va a ser capaz de ayudar a mí aquí. He escrito un breve ArcGIS secuencia de comandos de Python (principalmente improvisaba a partir de otros ejemplos) que ordena una característica de la clase ascendente basado en dos campos (ruta, y la secuencia). Un tercer campo es, a continuación, rellena con un ascendente número. Un bloque If reinicia la numeración de cada ruta. El problema es el rendimiento. El proceso es muy lento cuando se ejecuta en mis datos de prueba (~8000 registros). Pienso en la ejecución de este en 100000 registros, por lo que cualquier ayuda o sugerencia para mejorar la velocidad será apreciado. Gracias. James

import arcpy,os
from arcpy import env

inTable = arcpy.GetParameterAsText(0)      #  Input feature class

#  set variables for route and sequence starting values
route_previous = ""
route_current = ""
new_sequence = 1

#  create an update cursor that will append ascending order sequence number to the Service_Type field
#  sorts ascending by Route and Sequence
rows = arcpy.UpdateCursor(inTable,'','','','Route A;Sequence A')

for row in rows:
    route_current = row.Route
#  if the current service location is on the same route as the previous
    if route_current == route_previous:
        row.setValue("Service_Type",new_sequence)
        new_sequence += 1
        rows.updateRow(row)
#  if the current service location is on a different route to the previous
    else:
        new_sequence = 1
        row.setValue("Service_Type",new_sequence)
        new_sequence += 1
        route_previous = row.Route
        rows.updateRow(row)

#  delete the update cursor
del rows

2voto

Eric Scrivner Puntos 1392

Si usted está usando Arcpy 10.0, hay algunas cosas que usted puede hacer para aumentar el rendimiento.

Un UpdateCursor es caro. El esfuerzo detrás de las escenas para realizar la conversión de datos entre python y COM tipos de datos es costoso, aproximadamente la mitad de un segundo para la mayoría de las computadoras por cada registro.

En el otro lado de leer y escribir los cálculos son más rápidos cuando se graba en la memoria del conjunto de datos, a continuación, copiar estos datos en el dataset de salida.

Usted puede hacer 2 cosas a la velocidad.

  1. Copiar todos los datos en un diccionario de python y realizar la agregación de datos que hay, a continuación, escribir los datos en el dataset de salida.
  2. Copia de sus datos en una base de datos en memoria, a realizar las operaciones de allí, a continuación, copiar los datos a su ubicación de salida.

El rendimiento puede depender de que el conjunto de datos que está utilizando. En orden de más eficiente menos eficiente del conjunto de datos a utilizar es la siguiente:

  1. Shapefile
  2. Geodatabase de archivos
  3. Geodatabase Personal

Si usted está usando Arcpy 10.1, utilice los Datos de Acceso a las bibliotecas, su rendimiento debe aumentar ampliamente fuera de la caja.

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