Nota: Embora esta pergunta tenha uma resposta, qualquer outra dica para otimizar um processo de cursor seria muito apreciada. Eu estarei monitorando todas as atualizações.
Atualmente, meu chefe (que trabalha na Avenue) e eu (trabalhando em Python) estão tentando resolver o mesmo problema. Em vez disso, nós dois resolvemos isso, mas a velocidade com que nossas soluções operam são ... desconexas, para dizer o mínimo. O que o script dele processa em 2 horas pode levar o meu até 6. A única diferença real na sintaxe e na implementação da lógica vem dos Bitmaps do 3.x e dos Cursores do 10.x. Nós dois:
1) Armazene valores da Tabela 1.
2) Use esses valores para consultar uma linha na Tabela 2.
3) Armazene valores da Tabela 2 para inserção na Tabela 3 como uma nova linha.
Nos dois scripts, esses processos são concluídos em dois loops aninhados. Antes de começar a explorar o maravilhoso mundo da otimização de código, isso é uma ocorrência esperada ao comparar o desempenho do script Avenue com o Python? Essa não é a primeira vez que seus scripts superam os meus em termos de tempo de operação, então eu gostaria de saber se há algo que eu deva saber antes de me crucificar por scripts horríveis.
Aqui está o meu script sem bits estranhos:
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)
Edição : Dado alguns dos comentários até agora, pergunto-me se pode haver uma maneira melhor de fazer isso através de junções, embora eu seja duvidoso devido ao tamanho brobdingnagian (palavra do dia!) Das tabelas. O coração do processamento é anexar informações de uma tabela a qualquer registro correspondente em uma segunda tabela e criar uma terceira tabela contendo apenas os campos importantes. Eu queria tentar isso usando o SDE, mas isso parece não ser uma opção disponível. Pensamentos? Peço desculpas se minhas perguntas estão sempre tão envolvidas , mas estou tentando chegar ao fundo de um aborrecimento de longa data.
Respondido : A sugestão simples de Jakub diminuiu o tempo de processamento de 30 segundos por 500 registros para 3 segundos por 500 registros. Reiniciar o cursor de inserção em cada inserção diminuiu consideravelmente as coisas (obviamente). Embora essa possa não ser a maior otimização possível para esse processo quando comparada à velocidade do ArcView 3.x, é o suficiente para meus propósitos no momento. Mais sugestões são muito bem-vindas!