Remarque: Bien que cette question ait une réponse, tout autre conseil pour optimiser un processus de curseur serait grandement apprécié. Je surveillerai les mises à jour.
Actuellement, mon patron (qui travaille dans Avenue) et moi (travaillant en Python) essayons tous les deux de résoudre le même problème. Nous l'avons plutôt résolu tous les deux, mais la vitesse à laquelle nos solutions fonctionnent est ... disjointe, c'est le moins que l'on puisse dire. Ce que son script traite en 2 heures peut prendre le mien jusqu'à 6. La seule vraie différence de syntaxe et d'implémentation en logique vient des Bitmaps 3.x et des curseurs 10.x. Tous les deux:
1) Stockez les valeurs du tableau 1.
2) Utilisez ces valeurs pour interroger une ligne du tableau 2.
3) Stockez les valeurs du tableau 2 pour les insérer dans le tableau 3 en tant que nouvelle ligne.
Dans les deux scripts, ces processus sont exécutés en deux boucles imbriquées. Avant de commencer à creuser dans le monde merveilleux de l'optimisation de code, est-ce un événement attendu lors de la comparaison des performances du script Avenue avec Python? Ce n'est pas la première fois que ses scripts surpassent largement les miens en termes de temps de fonctionnement, donc je voudrais savoir s'il y a quelque chose que je devrais savoir avant de me crucifier pour des scripts horribles.
Voici mon script sans bits étrangers:
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 : Compte tenu de certains commentaires jusqu'à présent, je me demande s'il pourrait y avoir une meilleure façon de le faire via les jointures, bien que je sois douteux compte tenu de la taille brobdingnagienne (mot du jour!) Des tables. Le cœur du traitement consiste à ajouter des informations d'une table à tous les enregistrements correspondants d'une deuxième table et à créer une troisième table contenant uniquement les champs importants. Je voulais essayer ceci en utilisant SDE, mais cela ne semble pas être une option disponible. Pensées? Je m'excuse si mes questions sont toujours aussi compliquées , mais j'essaie d'aller au fond d'un agacement de longue date.
Réponse : la simple suggestion de Jakub a réduit à elle seule le temps de traitement de 30 secondes pour 500 enregistrements à 3 secondes pour 500 enregistrements. La réinitialisation du curseur d'insertion sur chaque insert a considérablement ralenti les choses (évidemment). Bien que ce ne soit peut-être pas le plus d'optimisation possible pour ce processus lorsqu'il est mis en place contre la vitesse d'ArcView 3.x, c'est suffisant pour mes besoins en ce moment. D'autres suggestions sont les bienvenues!