ArcGIS Geoprocessing Tools를 사용하는 Python 스크립트 (.exe로)를 컴파일 하시겠습니까?


12

나는 몇 달 동안 파이썬으로 코딩 해 왔으며 주로 지리 처리 작업을 위해 합리적으로 복잡한 스크립트를 개발했습니다. 즉, SQL / VBA / VBScript 배경에서 왔을 때 여전히 많은 것을 배우고 있습니다.

컴파일 된 코드는 일반적으로 언어 인터프리터가 처리 해야하는 코드보다 빠르게 실행되므로 지리 ​​처리 Python 스크립트를 빅 데이터 작업을 위해 .EXE 파일로 컴파일 할 가능성에 관심이 있습니다.

이것이 가능합니까? 그렇다면 arcgisscripting 또는 arcpy 모듈을 가져 오는 Python (.py) 스크립트를 컴파일하는 가장 좋은 방법은 무엇입니까?

나는 내가하고 싶은 일을 찾으려고 몇 분을 보냈고 검색은이 기사를 다른 사람들에게 돌려주었습니다 : http://www.ehow.com/how_2091641_compile-python-code.html

컴파일러가 작동하는 것처럼 보이지만 결과 .EXE 파일을 실행하면 일부 파일을 사용할 수 없다는 암호 오류가 발생했습니다.

파이썬 스크립트는 명령 줄에서 합리적으로 잘 보이는 것을 실행하지만 .py 파일을 컴파일 할 수 있다면 약간의 개선이 있는지 궁금합니다. 다시 한 번 처리하는 데 +20 시간이 걸리는 몇 가지 큰 데이터 세트 (입력 수질 샘플 사이트의 유역 묘사)를 사용하고 있습니다. 개선을 위해 얻을 수있는 것은 무엇이든 취할 것입니다.

이 스크립트는 사이트의 테스트 세트를 사용하여 명령 줄에서 빠른 외부는 ArcGIS의 10 %를 달렸다 ArcCatalog에서 새 도구 상자에서 스크립트 도구로 스크립트를 설정합니다. 전용 컴퓨터에서 ArcGIS 인스턴스를 열지 않고 명령 줄에서 스크립트를 실행했습니다.

그렇다면 arcgisscripting 모듈을 가져오고 ArcToolBox 도구를 호출하는 Python 스크립트를 컴파일 할 수 있습니까?

편집하다

입력 해 주셔서 감사합니다. 이것은 도움이됩니다. 이 스크립트는 주로 많은 ArcGIS 도구를 조정하고 원하는 형식 / 위치 / 적절한 속성으로 출력하는 방법입니다. 이미 중간 래스터 파일에 대한 스크래치 개인 지오 데이터베이스 대신 스크래치 폴더에 작성하여 ESRI GRID 형식 대 IMG 형식으로 저장할 수 있다고 생각합니다. 그래도 프로파일 러 제안을 확인하겠습니다.

내 사무실에는 파이썬에 대해 "컴파일 된 코드가 인터프리터를 통해 실행되는 코드보다 훨씬 빠르다" 고 말하는 일부 사람들이 있습니다. 도구는 어느 쪽이든 시간이 걸릴 것입니다. 그리고 오늘날의 컴퓨팅 머신에서는 코드를 해석하는 것이 컴파일 된 코드보다 그렇게 느리지 않을 수 있으므로 여분의 마일을 보장합니다.

편집 -래스터 형식의 프로그램 최적화 업데이트.

이 Python 프로그램의 "최적화"에 대한 후속 조치를 원했고 개인 래스터 데이터베이스 대신 GRID 형식으로 중간 래스터를 작성하여 2 시간의 처리 시간을 단축 할 수있었습니다. 뿐만 아니라 데이터 크기 디스크 공간 소비가 크게 줄었습니다. 원래 모든 래스터를 작성했을 때 (래스터로 변환 한 후 유역 래스터로 변환 된 포인트 피처 일뿐) 해당 파일에 대해서만 37.1GB의 데이터가 생성되었습니다. 후자의 두 데이터 출력을 GRID 형식의 폴더에 쓰면 667MB의 데이터로 줄어 듭니다.

파일 GDB가 주로 데이터 크기와 관련하여 이러한 데이터를 처리하는 방법을 궁금합니다. 그러나 처리 시간을 9.5 시간에서 7.5 시간으로 단축하면 GRID 형식의 지오 데이터베이스 외부의 래스터를 다루는 데 충분합니다.


오늘 아침 ArcGIS Server 블로그는 매우시의 적절합니다. Sterling @ esri는 왜, 언제 [여기] [1] [1]에 대한 개요를 잘 보여줍니다.
Brad Nesom

답변:


15

첫 번째 질문 : 파이썬에서 얼마나 많은 일을하고 있습니까? 지오 프로세싱 도구를 부르고 있습니까? 아니면 파이썬에서 상당수의 숫자 분석을하고 있습니까? 전자의 경우 병목 현상이 도구에 존재하고 스크립트에서 기본 코드를 사용하면 다른 영리한 해결 방법만큼 구입하지 못할 것입니다. 후자의 경우 느린 알고리즘을 찾고 더 나은 알고리즘 또는 numpy 또는 아래에 설명 된 다른 옵션을 사용하여 느린 것을 찾고 더 빠를 수 있습니다.

py2exe 실제로 코드를 네이티브 x86 / x64로 컴파일 하지 않고 스크립트를 바이트 코드로 포함하는 실행 파일을 제공하며 시스템에서 Python을 사용하지 않고 사용자에게 스크립트를 배포하는 가장 이식 가능한 방법을 제공합니다. arcgisscripting을 묶으려고 할 때 실패했기 때문에 작동하지 않습니다. 실제로 py2exe를 작동시키는 것은 여전히 ​​성능 측면에서 아무것도하지 않습니다.

먼저 프로파일 러를 사용하여 느린 비트를 식별하고 거기서부터 최적화하는 것이 좋습니다. 파이썬 에는 매우 좋은 세트가 내장되어 있습니다 . 장기적으로 cProfile 을 사용 하여 잠재적 위치를 더 빨리 찾을 수 있습니다. 거기에서 섹션을 커스텀 C로 최적화하거나 Cython .pyx 모듈 과 같은 작은 부분을 실험 해 볼 수 있습니다 .

Cython에서 전체 Python 스크립트를 기본 코드 확장 모듈로 빌드 할 수는 있지만 Psyco 는 진입 장벽이 낮아 성능을 향상시킬 수도 있습니다.


4

스크립트 버전과 비교하여 ArcToolbox의 표준 도구에서 유역 묘사가 실행되는 데 얼마나 걸립니까? 시간이 비슷하다면 개선이 없을 것 같습니다. ArcMap 외부의 백그라운드에서 긴 프로세스를 실행하는 것이 좋습니다.


나는 원래의 질문을 명확히하고, 여전히 긍정 예 / 아니오 대답을 얻기를 희망하고 있습니다.이 답변이 내 질문에 대답하지 않기 때문에 그러한 코드를 컴파일 할 수 있습니까?
turkishgold

2
@turkish 그것은 당신의 질문에 직접 대답하지 않을지도 모르지만 그것은 훌륭한 제안입니다. 프로세스가 묘사하는 데 모든 시간을 소비하는 것이 좋을 것이므로 코드 를 조정하는 데 많은 도움이 되지 않습니다 . 그러나 알고리즘을 다시 고려하면 큰 차이가 생길 수 있습니다. 따라서 가장 먼저해야 할 작업 중 하나는 현재 실행을 프로파일 링하여이 컴파일 방식으로 시간을 낭비하고 있는지 확인하는 것입니다.
whuber

1
@Dan 및 @whuber에 동의합니다. 더 심층적 인 분석 (즉, 벤치마킹 및 프로파일 링)을 수행하면 단순한 무차별 컴파일 모든 접근 방식보다 성능 개선에 대한 통찰력이 훨씬 뛰어납니다.
Jason Scheirer

4

정당한 이유없이 개인 지오 데이터베이스를 사용하지 마십시오. 우리의 경험에서 그들은 지속적으로 ESRI 데이터 저장 (모든 다른 형태보다 훨씬 느린 REF ). GIS.se에서 파일 gdb보다 빠른 개인 보고서를 읽었지만 여기에서 읽었습니다.

워크 플로가 여러 번의 작은 반복으로 구성된 경우 지오 프로세서를 생성하고 라이센스를 확인하라는 호출은 종종 파이썬을 사용하는 데 가장 많은 시간이 소요됩니다. 따라서 앞이나 뒤에서 gp = ...(또는 import arcpyv10에서) 가능한 한 많이하는 것이 내가 많이 사용하는 기술 중 하나입니다.

컴파일과 관련 하여이 인용문 은 가장 잘 말합니다.

컴파일 된 [python] 스크립트를 실행할 때 시작 시간 이 더 빠르지 만 (컴파일 할 필요가 없으므로) 더 빨리 실행 되지 않습니다 .

Mark Cederholm은 shapecopy 작업 (슬라이드 # 4)에 대한 통계와 함께 Python에서 ArcObject를 사용하는 방법에 대한 프레젠테이션 을 제공합니다. 파이썬은 C ++로 달성 할 수있는 것의 32 % (VBA는 92 %, VB & C #는 48 %)에서 잘 작동하지 않습니다. 너무 빨리 실행되지 않고 비명을 지르지 마십시오. 많은 지오 프로세싱 도구는 어쨌든 파이썬 스크립트입니다 ( '* .py'에 대한 c : \ program files \ arcgis \ 검색).

많은 사람들이 다른 장소에서 말했듯이, 파이썬으로 C 또는 C ++ 핵심 함수를 컴파일하거나 작성하여 성능을 최적화하는 데 소요되는 시간은 종종 런타임에 발생한 실제 성능 향상을 떨어 뜨립니다. 많은 사람들이 파이썬의 주요 이점은 개발자 시간을 최적화하고 향상시키는 것이라고 말합니다 . 인간의 관심은 기계 처리 시간보다 훨씬 더 가치 있고 비쌉니다.


1
그렇습니다. 필자의 돈을 위해 개발자 시간의 최적 사용법은 Python에서 프로토 타입 *, 벤치 마크, 병목 현상을 최적화하기 위해 C / C ++로 드롭 다운하는 것입니다. * 나는 프로토 타입을 말하지만, '프로토 타입'이 프로덕션에 들어가는 시간의 95 %를 알고 있습니다.
Jason Scheirer

Python의 ArcObjects에 대한 링크에 대한 의견과 감사합니다. GDB에 쓰는 것은 데이터 관리 관점 대 shapefile (shapefile의 특성 테이블 대 피쳐 클래스, 지오메트리 표현, 전반적인 데이터 관리 관행 등)뿐만 아니라 훨씬 쉽고 깔끔하게 할 수있는 것들의 이점이 있다고 생각합니다. 액세스 환경과 DBF 파일 처리 따라서 기본적으로 현재 수행중인 작업과 출력 데이터와 관련하여 수행 할 수있는 비용 이점의 균형을 유지해야합니다. GDB 외부의 래스터와 GDB의 다른 모든 것들이 작동하는 것 같습니다.
turkishgold

1

파이썬 코드를 기계 코드로 컴파일 할 수 없습니다. 처음 실행될 때 중간 언어 인 '바이트 코드'로 컴파일됩니다 (pyc 파일 생성).

py2exe는 인터프리터에 필요한 dll 파일과 필요한 python 파일 / 외부 파일을 실행 파일로 래핑합니다. 컴파일되지 않았습니다-런타임은 크게 다르지 않아야합니다.

서로 다른 기술을 조합하여 Python 코드를 매우 빠르게 실행할 수 있습니다.

가장 먼저해야 할 일은 병목 현상을 찾기 위해 코드를 프로파일 링하는 것입니다. 일단 발견되면 일반적 으로이 프로세스를 사용합니다.

  • numpy 배열 또는 map () 함수를 사용하여 'for'루프를 제거하십시오. 이것은 기본적으로 루프를 C로 푸시합니다.
  • 알고리즘의 더 나은 구현을 조사하십시오 (이러한 유형은 위와 동시에 진행됨). I / O 작업 수를 줄이는 것과 같이 데이터가 인접한 블록에 액세스 / 저장되도록합니다.
  • 루프 내에서 값 비싼 조회를 피하고 루프 내에서 'if'블록을 피하는 것과 같은 해석기 '트릭'(대신 'try'사용)
  • 다시 프로파일 링
  • 여전히 너무 느리면 Cython을 사용하여 중요한 부분을 C로 밀어 넣는 방법 (또는 C로 직접 작성, dll 작성 및 ctypes를 사용하여 호출)을 살펴보십시오.
  • 다시 프로필
  • 여전히 너무 느리면 병렬 또는 GPU 컴퓨팅 (멀티 프로세싱 라이브러리, pyCUDA, ParallelPython 등)을보십시오.

0

다른 위치에서 파이썬 스크립트를 가져 오면 .pyc 파일이 생성됩니다. 따라서 컴파일 과정에서 차이가 있는지 테스트하는 쉬운 방법은 스크립트를 함수 (예 : main ())로 바꾸는 것입니다. 해당 스크립트를 example.py다른 이름으로 저장하면 다음 줄을 사용하여 다른 파일을 작성하십시오.

import example
example.main() # call your script(s)

스크립트 내에서 실행하고 스크립트를 가져올 때 실행하면 차이가 무엇인지 알 수 있습니다. 이것은 그것을 수행하는 최첨단 방법입니다.

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