Nota: sebbene questa domanda abbia una risposta, qualsiasi ulteriore consiglio per l'ottimizzazione di un processo del cursore sarebbe molto apprezzato. Monitorerò eventuali aggiornamenti.
Attualmente, il mio capo (che lavora in Avenue) e io (lavorando in Python) stiamo entrambi tentando di risolvere lo stesso problema. Piuttosto, l'abbiamo risolto entrambi, ma la velocità con cui operano le nostre soluzioni è ... a dir poco sconnessa. Ciò che il suo script elabora in 2 ore può portare il mio a 6. L'unica vera differenza nella sintassi e nell'implementazione nella logica viene dalle Bitmap 3.xe dai Cursori 10.x. Entrambi:
1) Memorizzare i valori dalla Tabella 1.
2) Utilizzare questi valori per eseguire una query su una riga nella Tabella 2.
3) Memorizzare i valori dalla Tabella 2 per l'inserimento nella Tabella 3 come nuova riga.
In entrambi gli script, questi processi sono completati in due cicli nidificati. Prima di iniziare a scavare nel meraviglioso mondo dell'ottimizzazione del codice, è questo un evento previsto quando si confrontano le prestazioni degli script Avenue con Python? Questa non è la prima volta che i suoi script superano notevolmente i miei in termini di tempo di operazione, quindi vorrei sapere se c'è qualcosa di cui dovrei essere consapevole prima di crocifiggermi per gli orribili script.
Ecco il mio script senza bit estranei:
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)
EDIT : Dato alcuni dei commenti finora, mi chiedo se potrebbe esserci un modo migliore per farlo tramite join, anche se sono dubbioso data la dimensione dei tavoli di brobdingnagian (parola del giorno!). Il cuore dell'elaborazione è aggiungere informazioni da una tabella a tutti i record corrispondenti in una seconda tabella e creare una terza tabella contenente solo i campi importanti. Volevo provare questo usando SDE, ma sembra non essere un'opzione disponibile. Pensieri? Mi scuso se le mie domande sono sempre così coinvolte , ma sto cercando di arrivare al fondo di una seccatura di vecchia data.
Risposta : il semplice suggerimento di Jakub da solo ha ridotto il tempo di elaborazione da 30 secondi per 500 record a 3 secondi per 500 record. Riavviare il cursore di inserimento su ogni inserimento ha rallentato notevolmente le cose (ovviamente). Anche se questo potrebbe non essere il massimo dell'ottimizzazione che si può fare per questo processo se confrontato con la velocità di ArcView 3.x, al momento è sufficiente per i miei scopi. Ulteriori suggerimenti sono molto graditi!