ArcGIS 도구로 실행되는 Python 스크립트 속도를 높이는 방법 [닫기]


30

이것은 일반적인 질문입니다. GIS 프로그래머가 툴박스로 가져 와서 실행하는 이상한 스크립트의 속도를 높이기 위해 사용한 팁과 요령이 궁금합니다.

나는 사무실에서 GIS 이외의 사용자가 GIS 데이터를 처리하도록 돕기 위해 거의 매일 스크립트를 작성합니다. 나는 일반적으로 ArcGIS 10.0 처리가 9.3.1보다 느리고 때로는 파이썬 스크립트를 실행할 때 더 느리다는 것을 알았습니다.

실행하는 데 24 시간 이상 걸리는 스크립트의 특정 예를 나열하겠습니다. 버퍼의 각 모양에 대해 버퍼의 래스터 영역을 나타내는 루프입니다. 버퍼의 모양은 약 7000입니다. 나는 이것이 오랫동안 실행될 것이라고 믿지 않는다. 에이

while x <= layerRecords:

    arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
    arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x))                                  # Selecting the record
    TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc)                          # Tabulate the area of the single row

    arcpy.AddMessage ("          - Row: " + str(x) + " completed")
    x = x + 1
    z = z + 1

누구든지 말하기 전에 전체 버퍼에서 영역을 표로 만들었지 만 1 개 이상의 레코드에서 실행하면 오류가 발생합니다. 결함이있는 도구이지만 사용해야합니다.

어쨌든 누구나이 스크립트를 최적화하거나 속도를 높이는 방법에 대한 아이디어가 있다면 가장 높이 평가 될 것입니다. 그렇지 않으면 ArcGIS에서 사용될 때 파이썬에 대한 속임수가 있습니까?

답변:


25

프로세스 속도를 높이는 데 도움이되는 몇 가지 제안은 다음과 같습니다.

  1. 속성 별 레이어 선택은 ArcGIS Desktop을 시작하지 않고도 Python 전용 스크립트에있을 수 있습니다. "버퍼"참조를 파일 기반 참조에서 "ArcGIS 레이어"참조로 변환해야합니다.이 참조는 ArcGIS가 선택 쿼리를 처리 할 수 ​​있습니다. 사용 arcpy.MakeFeatureLayer_management 당신의 "하면서"루프 위 ( "광", "buff_lyr"), 다음은 "buff_lyr"를 사용하는 동안 루프 아래 참조를 변경합니다.

  2. 가능한 in_memory 작업 공간 을 사용하여 많은 GP 작업을 처리 하십시오. arcpy.CopyFeatures_management (shapefile, "in_memory \ memFeatureClass")를 사용하여 소스를 메모리로 이동하십시오. 메모리에 필요한 모든 기능 클래스를 읽을 수있는 충분한 RAM이있는 경우에만 잘 작동합니다. 그러나 in_memory 작업 공간 (예 : 프로젝트 도구)을 사용하여 실행할 수없는 GP 작업이 있다는 점에 유의하십시오.

ArcGIS 9.3 온라인 도움말 기사 " 중간 데이터 및 스크래치 작업 공간 "에서 (이 언어는 10.0 및 10.1 도움말에서 제거되었습니다.)

참고 : 테이블 및 피처 클래스 (점, 선, 다각형) 만 in_memory 작업 공간에 쓸 수 있습니다. in_memory 작업 공간은 하위 유형, 도메인, 표현, 토폴로지, 기하학적 네트워크 및 네트워크 데이터 세트와 같은 확장 지오 데이터베이스 요소를 지원하지 않습니다. 간단한 기능과 테이블 만 쓸 수 있습니다.

ArcGIS 10.1 온라인 도움말 기사 " 메모리 내 작업 공간 사용 "에서 :

인 메모리 작업 공간에 출력을 기록 할 때 다음 사항을 고려해야합니다.

  • 메모리 내 작업 공간에 기록 된 데이터는 일시적이며 응용 프로그램을 닫으면 삭제됩니다.
  • 테이블, 피처 클래스 및 래스터는 메모리 내 작업 공간에 쓸 수 있습니다.
  • 메모리 내 작업 공간은 하위 유형, 도메인, 표현, 토폴로지, 기하학적 네트워크 및 네트워크 데이터 세트와 같은 확장 지오 데이터베이스 요소를 지원하지 않습니다.
  • 메모리 내 작업 공간에서 기능 데이터 세트 또는 폴더를 작성할 수 없습니다.

1
환상적입니다! ArcMap 외부에서 선택을 사용하는 방법을 찾고 있었지만 지금까지 실패했습니다. 이 문제와 관련하여 실제로 행당 시간을 20 초에서 13 초로 줄였습니다. 그러나 나는 빨리 다른 문제를 해결하고 루프 내에서 MakeFeatureLayer를 수행했으며 9 초로 줄었습니다. 피처 레이어에서 표를 작성하는 것보다 각 셰이프에서 피처를 만들어서이 작업을 수행했습니다. 가능한 경우 계속 더 낮추고 싶지만 이미 훨씬 빠른 프로세스입니다!
코디 브라운

# 2에서 언급했듯이 CopyFeatures를 사용하여 소스 데이터를 in_memory로 복사 한 다음 in_memory 소스에 대해 feature_layer를 만듭니다. 메모리에 초기 복사를하는 데 몇 초가 소요될 수 있지만 copyfeatures + tabulate_areas 처리는 현재 모델보다 총 처리 시간이 더 빠릅니다.
RyanDalton

나는 그것을 시도했지만 그 솔루션이 루프 프로세스를 더 빠르게 만들 것 같지만 그렇지 않습니다. 루프에서 피처 레이어를 만들면 루프 당 약 8-10 초가 걸리고 루프 전에 피처 레이어를 만들면 루프 당 11-14 초가 걸립니다. 솔루션이 더 빨리 처리되는 것처럼 들리기 때문에 왜 그런지 잘 모르겠습니다. 나는 8GB의 RAM을 가지고 있기 때문에 그것이 문제 일지 의심됩니다.
코디 브라운

또한 루프 전에 피처를 in_memory에 복사 한 다음 루프에서 피처 레이어를 만들면 성능이 약간 빨라집니다. 각 루프마다 행당 8 초를 유지합니다. 전체 처리 시간이 26 시간에서 22 시간으로
Cody Brown

아이디어를 추가 한 후 스크립트가 크게 향상되었습니다. 당신과 모두의 도움을 주셔서 감사합니다!
코디 브라운

28

일반적인 파이썬 최적화 기술로 상당한 시간을 절약 할 수 있습니다.

스크립트에서 홀드 업 위치를 낮추는 가장 좋은 방법은 내장 cProfile 모듈을 사용하는 것입니다.

from cProfile import run
run("code") # replace code with your code or function

작은 데이터 샘플을 사용하여 테스트하면 시간이 가장 많이 걸리는 함수 호출을 정확하게 찾을 수 있습니다.

더 빠른 파이썬 코드를위한 일반적인 포인터 :

  • 리스트 이해는 일반적으로 루핑보다 빠릅니다.
  • 생성기는 한 번에 전체 목록을 생성하는 대신 한 번에 하나의 항목을 생성합니다
  • 파이썬 2에서 범위 대신 xrange를 사용하십시오 (3에서는 필요하지 않음)
  • 이 항목이 세트에있는 경우 결정에 관해서 만은 그 내용을 반복 처리에 있어서는 일반적으로 느린 목록보다 때 세트 예비 목록을 할 수있는 소스
  • 함수 호출을 할 수 있습니다 성능에 비용이 많이 드는 소스
  • 더 많은 팁과 세부 사항은 여기를 확인하십시오 .Python Perfomance Tips and here 10 Python Optimization Tips and Issues

스크립트와 관련 하여이 컴퓨터에 Arc가 설치되어 있지 않기 때문에 ArcPy 측면에 대해서는 언급 할 수 없지만 while 루프 대신 for 루프를 사용해보십시오. 또한 x = x + 1은 x + = 1로 쓸 수 있습니다 :

for record in layerRecords:
arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x))                                  # Selecting the record
TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc)                          # Tabulate the area of the single row

arcpy.AddMessage ("          - Row: " + str(x) + " completed")
x+=1
y+=1

1
마지막 글 머리 기호에 남은 두 개의 링크를 사용했으며 몇 가지 빠른 수정으로 스크립트를 실제로 도울 수있었습니다!
코디 브라운

두 가지 정답을 수여 할 수 있다면 귀하의 답변은 실제로 파이썬 속도를 높이는 방법에 대한 많은 아이디어를 제공했지만 @RyanDalton은 가장 영향을 미친 아이디어를 제공했습니다. 정말 감사합니다!
코디 브라운

13

컴퓨터의 내장 드라이브에 기록하고 있는지 확인하십시오. 필요하지 않은 네트워크를 통해 도달하면 처리 속도가 느려질 수 있습니다. 후속 읽기-쓰기를 가능한 한 빨리 유지하기 위해 프로세스의 첫 번째 단계로 데이터를 복사하는 것이 더 빠를 수도 있습니다.

ArcMap 외부에서 스크립트를 완전히 실행하면 훨씬 빠릅니다. 처리 중에 맵이 필요하지 않으면 ArcMap을 사용하지 마십시오.


ArcCatalog의 모델 내에서 스크립트 자체를 실행하면 Calculate Value대화 상자 내에서 스크립트를 실행하는 것이 ArcMap의 ArcPy 창에서 동일한 스크립트를 실행하는 것보다 빠르게 처리됩니다. 그것은 순수하게 일화적인 관찰입니다.
Cindy Jayakumar

1
Tabulate가 제대로 작동하려면 맵이 필요하다고 생각하지만 시도해 보겠습니다. ArcMap 외부에서 작동하면 속도가 빨라집니다. 또한 이미 로컬 디스크에서 실행 중이므로 스크립트 속도가 이미 두 배가되었습니다.
코디 브라운

슬프게도 Select는 ArcMap 외부에서 작동하지 않으며 모양별로 모양을 표로 만들어야하기 때문에 필요합니다.
코디 브라운

3
@ CodyBrown- 선택이 ArcMap 세션 외부에서 작동하지 않습니다. MakeFeatureLayer 도구 사용에 대한 내 답변을 참조하십시오.
RyanDalton

라이언이 맞아 선택 도구를 단독으로 사용하면 공간 데이터 또는 테이블 데이터의 테이블보기가 작성됩니다. ModelBuilde 또는 스크립트에서 사용하는 경우 뷰를 작성해야하며 경우에 따라 MakeFeatureLayer 도구를 사용하여 작성해야합니다.
dchaboya

6

이것은 ArcMap 내에서 ArcPy 도구를 실행하는 것에 대한 귀하의 질문에 대답하지 않을 수도 있지만 지리 처리 도구 및 Python으로 고기 처리를해야 할 때 IDE PyScripter를 사용하여 GIS 시스템 외부에서 실행하는 경향이 있습니다 . 나는 그것이 더 빨리 달린다는 것을 알았다. 또한 작은 임시 출력 데이터 세트 ( in_memory 작업 공간 과 비슷한 비트)에 RAMDISK를 사용했습니다.

글쎄, 그들은 내 최고의 팁입니다! :)


2
파이썬 IDE에서 스크립트를 실행할 때 많은 사람들이 변수 및 기타 다양한 디버깅 지원을 감시하는 데 도움이되는 역 추적 기능을 주입합니다. 이 함수는 스크립트를 항상 호출 할 때 너무 많은 경우 스크립트 속도를 크게 저하시킬 수 있으며 때로는 사용자 개입없이 암시 적으로 설치됩니다. ArcMap에서 실행되는 Python 스크립트가 4 분 안에 실행되는 반면 Wing IDE의 동일한 스크립트가 3 시간이 소요되는 특별한 병리학 적 사례가있었습니다. Wing없이 Python.exe에서 실행 되 자마자 2-3 분의 런타임 영역으로 돌아갔습니다.
Jason Scheirer

1
ArMap에서 스크립트를 조정하는 데 어려움이 있었고 때로는 Pyscripter로 전환 할 때까지 최적화 팁을 사용하지 않고 Arcmap에 비해 실행 시간을 단축 할 수 있습니다.
geogeek

@JasonScheirer 당신은 이것을 끄는 Wing의 조정을 찾았습니까? 나는 하나가 확신합니다.
커티스 가격

5

arcpy.SetProgressorLabel을 주석 처리하고 속도를 높이십시오. DOS daze로 돌아가는 모든 화면 출력이 처리 시간을 크게 느리게한다는 것을 알았습니다. 실제로 해당 출력을 볼 필요가 있으면 N 번째 루프마다 출력을 시도하십시오.


4

import xxxx사용하지 않는 라인을 제거하십시오 .

(즉 import Math, 아직 수학적 함수를 사용하지 않는 경우 스크립트로드에서 시간이 걸립니다)

이 스크립트는 사용자와 같은 단일 스크립트에 큰 영향을 미치지 않지만 자주 반복적으로 실행되는 모든 스크립트에 영향을 미칩니다.


7
나는 표준 파이썬 모듈이 arcpy 모듈을 초기화하는 데 천분의 일 이상이 걸린다는 것을 의심한다.
blah238

1
@ blah238 import Math은 아마도 나쁜 예일 것입니다. 그러나 더 큰 ArcPy 라이브러리 중 일부는로드하는 데 상당한 시간이 걸립니다.
nagytech

1
이것은 여전히 ​​몇 시간이 아닌 단 몇 초 만에 면도합니다
Mike T

1
@MikeToews 자주 반복적으로 실행되는 스크립트의 경우 몇 일 / 주 등의 과정에서 몇 초가 더해집니다. 이것이 OP의 주요 문제를 해결하지는 못했지만 일반적인 팁을 요청했습니다.
nagytech
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.