Nota: Si bien esta pregunta tiene una respuesta, cualquier otro consejo para optimizar un proceso de cursor sería muy apreciado. Estaré monitoreando cualquier actualización.
Actualmente, mi jefe (que trabaja en Avenue) y yo (trabajando en Python) intentamos resolver el mismo problema. Más bien, ambos lo hemos resuelto, pero la velocidad a la que operan nuestras soluciones son ... desarticuladas, por decir lo menos. Lo que su script procesa en 2 horas puede llevar el mío hasta 6. La única diferencia real en la sintaxis y la implementación en la lógica proviene de los mapas de bits de 3.x y los cursores de 10.x. Los dos:
1) Almacene valores de la Tabla 1.
2) Use esos valores para consultar una fila en la Tabla 2.
3) Almacene los valores de la Tabla 2 para insertarlos en la Tabla 3 como una nueva fila.
En ambos scripts, estos procesos se completan en dos bucles anidados. Antes de comenzar a profundizar en el maravilloso mundo de la optimización del código, ¿es este un evento esperado al comparar el rendimiento del script Avenue con Python? Esta no es la primera vez que sus guiones han superado en gran medida las mías en términos de tiempo de operación, por lo que me gustaría saber si hay algo de lo que deba estar al tanto antes de crucificarme por las horribles secuencias de comandos.
Aquí está mi script sin bits extraños:
import arcpy
import time
import sys
import os
def recordfindcopy(inFile,query,outFile):
findRecord = arcpy.SearchCursor(inFile,query)
for record in findRecord:
copyRecord = arcpy.InsertCursor(outData) # <--- D'oh! (See answer)
field = record.FIELD
copy = copyRecord.newRow()
copy.FIELD = field
copyRecord.insertRow(copy)
StreetsFileList = [r"Path",
r"Path"]
for sfile in StreetsFileList:
inStreets = sfile
inTable = r"Path"
outData = r"Path"
fsaEntry = arcpy.SearchCursor(inTable)
for row in fsaEntry:
id = row.ID
sQuery = "ID = %s " % (str(id))
recordfindcopy(inStreets,sQuery,outData)
EDITAR : Teniendo en cuenta algunos de los comentarios hasta ahora, me pregunto si podría haber una mejor manera de hacer esto a través de uniones, aunque dudo dado el tamaño brobdingnagian (¡palabra del día!) De las tablas. El corazón del procesamiento es agregar información de una tabla a cualquier registro coincidente en una segunda tabla y crear una tercera tabla que solo contenga los campos importantes. Quería probar esto usando SDE, pero parece que no es una opción disponible. Pensamientos? Pido disculpas si mis preguntas siempre están tan involucradas , pero estoy tratando de llegar al fondo de una molestia de larga data.
Respondido : la simple sugerencia de Jakub solo redujo el tiempo de procesamiento de 30 segundos por 500 registros a 3 segundos por 500 registros. Reiniciar el cursor de inserción en cada inserción ralentizó considerablemente las cosas (obviamente). Si bien esto puede no ser la mayor optimización que se puede hacer para este proceso cuando se compara con la velocidad de ArcView 3.x, es suficiente para mis propósitos en este momento. ¡Más sugerencias son bienvenidas!