ArcView 3.x Avenue 비트 맵 (탭?) vs. ArcView 10 Python 커서


9

참고 :이 질문에 대한 답변이 있지만 커서 프로세스를 최적화하기위한 추가 팁을 주시면 감사하겠습니다. 모든 업데이트를 모니터링 할 것입니다.

현재 상사 (애비뉴에서 일하는 사람)와 (파이썬에서 일하는 사람) 모두 같은 문제를 해결하려고합니다. 오히려 우리는 둘 다 해결했지만 솔루션이 작동하는 속도는 ... 분리되어 있습니다. 그의 스크립트가 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의 속도에 맞설 때이 프로세스에 대해 가장 최적화 할 수는 없지만 현재로서는 내 목적으로 충분합니다. 추가 제안은 매우 환영합니다!


1
스크립트를 게시하고 싶습니까? GP 벤치 마크를 사용하는 애비뉴 / 파이썬에 대해 모르겠습니다.
데릭 스윙 리

기존 ArcView 3.2 (애비뉴)에서는 ArcGIS 8.x ~ 10. * arcpy / python보다 테이블 조인 및 쿼리가 훨씬 빠릅니다. 기본적으로 ArcGIS 제품의 코드 양이 훨씬 더 많습니다.
Mapperz

2
@Mapperz 당신은 아주 옳습니다. 그러나 ArcView 3.x의 행 단위 처리는 각 요청에 대해 10,000X 해석 오버 헤드로 인해 엄청나게 느립니다 (이를 벤치 마크했습니다). 제안한대로 조인 및 쿼리와 같은 "높은 수준의"요청을 사용하여 루프를 피할 수있는 경우 ArcView 3.x는 ArcGIS의 성능을 능가하지만 레코드에 대한 명시적인 루프를 포함하는 헤드 투 헤드 테스트에서는 그럴듯합니다. 어느 쪽이든 상대적으로 약간의 마진으로 이길 수 있습니다.
whuber

@Whuber @Derek 타르.
Nathanus

답변:


2

나는 프로그래밍에 익숙하지 않지만 파이썬에 매우 익숙하지 않으므로 소금 한 덩어리로 이것을 가져 가라.

copyRecord = arcpy.InsertCursor(outData)

For Next 루프 이전에 삽입 커서 를 설정 하지 않아야 합니까? "out"데이터의 경로가 "outData"변수에 저장된 경우 반복 할 때마다 재설정 할 필요가 없습니다. 나는 이것이 속도를 크게 높여야한다고 생각합니다.


잘 잡았습니다. 다음 주에 사무실로 돌아올 때 시도해 볼 것입니다.
Nathanus

5

ArcPy 또는 9.3 년경 arcgisscripting을 사용한다고 가정합니다. 어느 쪽이든 여기 기술이 처리 속도를 높여 줄 것입니다 .... 보스보다 낫습니다.

첫 번째는 메모리 이외의 매체를 사용하여 조회 및 삽입을 수행하면 프로세스 속도가 느려집니다. Avenue는 빠르게 작동하도록 최적화되어 있으며 대부분의 다른 언어보다 IO에서 본질적으로 빠른 C \ C ++ (잘못된 경우 수정) 코드 기반을 사용합니다. Python은 ArcPy 또는 arcgisscripting과 같은 작업을 수행하기 위해 c 라이브러리에 연결하는 오버 헤드가있는 경우를 제외하고는 빠릅니다.

먼저 다음을 시도해보십시오.
1. 사용할 테이블을 다음 방법을 사용하여 메모리에 복사하십시오.

  • gp.CopyFeatures ( "featureclass \ FeatureclassName", " 'in_memory'\ FeatureclassName"에 대한 경로)-기능 클래스 및;
  • gp.CopyRow ( "path to featureclass \ FeatureTableName", " 'in_memory'\ FeatureTableName")- 'in_memory'피처 클래스 또는 테이블에있는 테이블의 경우.

    이렇게하면 RAM 디스크와 같은 메모리를 사용할 수 있으며 많은 디스크 스 래싱을 줄일 수 있습니다. FeatureDataset 매개 변수를 'in_memory'로 대체하여 기능 클래스 또는 테이블을 메모리에 작성할 수도 있습니다.

파이썬 컨테이너를 가능한 많이 사용하십시오. 이것은 또한 속도를 증가시킵니다.

마지막으로 ESRI 형식의 정보를 읽고 쓰는 데있어 효율성을위한 순서는 다음과 같습니다.

  1. 쉐이프 파일 (슬프지만 사실)
  2. 개인 지오 데이터베이스
  3. 파일 지오 데이터베이스
  4. ArcSDE (직접 연결하더라도 속도가 느림)

gis.stackexchange.com에서 작동하는 것들의 목록을 컴파일하려고 시도 하면서이 제안을 시도해보십시오. 여기를 참조하십시오


메모리 옵션이 유용 해 보이지만 거의 1GB의 클럭에 대해 쿼리하는 테이블의 결합 된 힘이 있습니다. 나는 이것을 가능하게 할 충분한 RAM이 있다고 생각하지만, 테이블의 크기가 심한 충돌을 일으킬 위험이 있습니까? 또한 파이썬 컨테이너 란 무엇입니까?
Nathanus

개인 gdb를 내 경험에서 직접 반전 된 gdb 파일보다 빠르게 배치하는 것에 놀랐습니다. 어딘가에서 시간을 탐험하는 것이 흥미로울 것입니다.
matt wilkie

현재 작업중 인 프로세스 일 수 있지만 gdb 파일은 느리지 만 단지 단지 파일이라는 것을 알았습니다. 나는 그들이 파에 있다고 말하고 파일 제한 때문에 순수하게 개인 gdb보다 gdb 파일을 선택합니다. 나는 이것에 대한 벤치 마크를 만드는 데 관심이 있습니다. 테스트 정의에 관심이 있습니까?
OptimizePrime

shapefile을 메모리에 넣으려고 시도했지만 도움이 거의되지 않는 것 같습니다 ... 실제로 스크립트가 그 후 처리를 중단했습니다.
Nathanus

3

Avenue가 Python보다 빠르지는 않지만 ArcView3이 ArcGIS보다 빠릅니다 (당신이하려는 일에서).

그것의 소리에서 이것은 본질적으로 비 공간 운동 이므로 dbfpy 또는 odbc 와 같은 데이터베이스 테이블에 직접 액세스 (예 : arcpy를 사용하지 않음)하여 실험 해 볼 수 있습니다 (내가 직접 시도하지는 않음). 개인적으로 내가 찾은 명령 줄 ogr2ogrGDAL / OGR 스위트가되게합니다 빠른 진도의 주문 는 ArcGIS에 해당하는 거래보다. 그래도 OGR 쿼리 기능에 살짝 빠져 들었으며 파이썬 바인딩 만 사용하여 아무것도 만들지 않았으므로 해당 속도가 전달되는지 알 수 없습니다.


여기서 유일한 문제는 비 공간 데이터를 공간 데이터에 추가한다는 것입니다. IE Shape몇 가지 다른 분야와 함께 지오메트리 및 추가 비 공간 데이터를 포함하는 새 레코드를 작성하고 있습니다. dpfpy와 odbc가 움직이는 Shapes필드 (및 해당 지오메트리)를 설명합니까?
Nathanus

Shape.dbf에 저장되어 있지 않은 shapefile에서는 작동 하지 않습니다. 이론적으로 그것은 odbc를 사용하여 개인 지오 데이터베이스 (.mdb)와 함께 작동 할 수 있지만 특히 이미 형상 파일과 개인 gdb를 모두 알고있는 OGR을 통해 이미 입증 된 경로가 있기 때문에 그 접근 방식에 관심이 있습니다.
matt wilkie

1

현재로서는 특히 유용한 답변은 아니지만 ArcGIS 10.1을 기다립니다. 올해의 esri dev 서밋에서는 arcpy 10.1 커서 지원이 완전히 다시 작성되었으며 훨씬 빠릅니다. 총회 기간 동안 약 8 배의 속도 향상이 있었다는 주장이있었습니다.


정보 주셔서 감사합니다. 다른 것이 없다면 기대할 것.
Nathanus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.