Hinweis: Obwohl diese Frage eine Antwort enthält, sind weitere Tipps zur Optimierung eines Cursorprozesses sehr willkommen. Ich werde nach Updates suchen.
Derzeit versuchen mein Chef (der in Avenue arbeitet) und ich (der in Python arbeitet) beide, dasselbe Problem zu lösen. Vielmehr haben wir beide es gelöst, aber die Geschwindigkeit, mit der unsere Lösungen arbeiten, ist ... gelinde gesagt unzusammenhängend. Was sein Skript in 2 Stunden verarbeitet, kann bis zu 6 Stunden dauern. Der einzige wirkliche Unterschied in der Syntax und Implementierung in der Logik besteht in den Bitmaps von 3.x und den Cursors von 10.x. Wir beide:
1) Speichern Sie die Werte aus Tabelle 1.
2) Verwenden Sie diese Werte, um eine Zeile in Tabelle 2 abzufragen.
3) Speichern Sie die Werte aus Tabelle 2 zum Einfügen in Tabelle 3 als neue Zeile.
In beiden Skripten werden diese Prozesse in zwei verschachtelten Schleifen abgeschlossen. Ist dies ein zu erwartendes Ereignis, bevor ich mich mit der wunderbaren Welt der Codeoptimierung befasse, wenn ich die Leistung von Avenue-Skripten mit Python vergleiche? Dies ist nicht das erste Mal, dass seine Skripte meine in Bezug auf die Betriebszeit deutlich übertroffen haben. Daher würde ich gerne wissen, ob ich etwas beachten sollte, bevor ich mich für schreckliche Skripte kreuzige.
Hier ist mein Skript ohne überflüssige Teile:
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 : Angesichts einiger der bisherigen Kommentare frage ich mich, ob es einen besseren Weg gibt, dies über Joins zu tun, obwohl ich angesichts der brobdingnagischen Größe (Wort des Tages!) Der Tabellen zweifelhaft bin. Das Herzstück der Verarbeitung besteht darin, Informationen aus einer Tabelle an übereinstimmende Datensätze in einer zweiten Tabelle anzuhängen und eine dritte Tabelle zu erstellen, die nur die wichtigen Felder enthält. Ich wollte dies mit SDE versuchen, aber das scheint keine verfügbare Option zu sein. Gedanken? Ich entschuldige mich, wenn meine Fragen immer so involviert sind , aber ich versuche, einem langjährigen Ärger auf den Grund zu gehen.
Beantwortet : Jakubs einfacher Vorschlag allein reduzierte die Verarbeitungszeit von 30 Sekunden pro 500 Datensätze auf 3 Sekunden pro 500 Datensätze. Das erneute Starten des Einfügecursors bei jeder Einfügung verlangsamte die Dinge erheblich (offensichtlich). Dies ist möglicherweise nicht die beste Optimierung, die man für diesen Prozess durchführen kann, wenn man die Geschwindigkeit von ArcView 3.x berücksichtigt. Für meine Zwecke reicht dies derzeit jedoch aus. Weitere Vorschläge sind herzlich willkommen!