Uwaga: Chociaż na to pytanie można znaleźć odpowiedź, wszelkie dalsze wskazówki dotyczące optymalizacji procesu kursora byłyby bardzo mile widziane. Będę monitorować wszelkie aktualizacje.
Obecnie zarówno mój szef (który pracuje w Avenue), jak i ja (pracujący w Pythonie) próbujemy rozwiązać ten sam problem. Obaj raczej to rozwiązaliśmy, ale szybkość, z jaką działają nasze rozwiązania, jest ... co najmniej rozłączna. To, co jego skrypt wykonuje w ciągu 2 godzin, może zająć moje nawet 6. Jedyna prawdziwa różnica w składni i implementacji logiki wynika z map bitowych 3.x i kursorów 10.x. My oboje:
1) Zapisz wartości z tabeli 1.
2) Użyj tych wartości, aby wykonać zapytanie do wiersza w tabeli 2.
3) Zapisz wartości z tabeli 2 i wstaw do tabeli 3 jako nowy wiersz.
W obu skryptach procesy te są wykonywane w dwóch zagnieżdżonych pętlach. Czy zanim zacznę zagłębiać się w cudowny świat optymalizacji kodu, jest to oczekiwane zjawisko podczas porównywania wydajności skryptu Avenue z Pythonem? To nie pierwszy raz, gdy jego skrypty znacznie przewyższają moje pod względem czasu działania, dlatego chciałbym wiedzieć, czy jest coś, o czym powinienem wiedzieć, zanim ukrzyżuję się za okropne skrypty.
Oto mój skrypt bez zbędnych bitów:
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)
EDYCJA : Biorąc pod uwagę niektóre dotychczasowe komentarze, zastanawiam się, czy może być lepszy sposób, aby to zrobić za pomocą złączeń, chociaż jestem wątpliwy, biorąc pod uwagę brobdingnagian (słowo dnia!) Rozmiar tabel. Sercem przetwarzania jest dołączenie informacji z jednej tabeli do dowolnych pasujących rekordów w drugiej tabeli i utworzenie trzeciej tabeli zawierającej tylko ważne pola. Chciałem wypróbować to za pomocą SDE, ale wydaje się, że nie jest to dostępna opcja. Myśli? Przepraszam, jeśli moje pytania są zawsze tak zaangażowane , ale staram się dotrzeć do sedna długotrwałej irytacji.
Odpowiedzi : sama prosta sugestia Jakuba skróciła czas przetwarzania z 30 sekund na 500 rekordów do 3 sekund na 500 rekordów. Ponowne zainicjowanie kursora wstawiania na każdej wkładce znacznie spowolniło (oczywiście). Chociaż może nie być to najlepsza optymalizacja, jaką można zrobić dla tego procesu, gdy porównamy go z szybkością ArcView 3.x, w tym momencie wystarczy dla moich celów. Dalsze sugestie są bardzo mile widziane!