참고 :이 질문에 대한 답변이 있지만 커서 프로세스를 최적화하기위한 추가 팁을 주시면 감사하겠습니다. 모든 업데이트를 모니터링 할 것입니다.
현재 상사 (애비뉴에서 일하는 사람)와 (파이썬에서 일하는 사람) 모두 같은 문제를 해결하려고합니다. 오히려 우리는 둘 다 해결했지만 솔루션이 작동하는 속도는 ... 분리되어 있습니다. 그의 스크립트가 2 시간 안에 처리하는 것은 최대 6 개가 될 수 있습니다. 논리에서 구문과 구현의 유일한 차이점은 3.x의 비트 맵과 10.x의 커서에서 비롯됩니다. 우리 모두:
1) 표 1의 값을 저장
하십시오 . 2)이 값을 사용하여 표 2의 행을 조회하십시오.
3) 표 3에 새 행으로 삽입하기 위해 표 2의 값을 저장하십시오.
두 스크립트에서이 프로세스는 두 개의 중첩 루프로 완료됩니다. 멋진 코드 최적화 세계를 파고 들기 전에 Avenue 스크립트 성능을 Python과 비교할 때 이것이 예상되는 것입니까? 그의 스크립트가 작업 시간 측면에서 내 성능을 크게 능가한 것은 이번이 처음이 아니므로, 끔찍한 스크립팅을 위해 자신을 십자가에 못 박기 전에 알아야 할 것이 있는지 알고 싶습니다.
여기 내 스크립트가 불필요한 비트가 있습니다.
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)
편집 : 지금까지 의견 중 일부를 감안할 때, 테이블의 brobdingnagian (오늘의 단어!) 크기를 감안할 때 의심 스럽지만 조인을 통해이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다. 처리의 핵심은 한 테이블의 정보를 두 번째 테이블의 일치하는 레코드에 추가하고 중요한 필드 만 포함하는 세 번째 테이블을 작성하는 것입니다. SDE를 사용하여 시도했지만 사용 가능한 옵션이 아닌 것 같습니다. 생각? 내 질문이 항상 그렇게 관련 되어 있다면 사과드립니다 . 그러나 오랫동안 성가신 문제를 해결하려고 노력하고 있습니다.
답변 : Jakub의 간단한 제안만으로 처리 시간이 500 레코드 당 30 초 에서 500 레코드 당 3 초로 단축되었습니다. 모든 인서트에서 인서트 커서를 다시 시작하면 작업 속도가 상당히 느려집니다 (분명히). 이것이 ArcView 3.x의 속도에 맞설 때이 프로세스에 대해 가장 최적화 할 수는 없지만 현재로서는 내 목적으로 충분합니다. 추가 제안은 매우 환영합니다!