CPU 사용 최대화


9

내 스크립트는 선을 다각형과 교차합니다. 3000 개 이상의 선과 500000 개 이상의 다각형이 있기 때문에 긴 프로세스입니다. PyScripter에서 실행했습니다.

# Import
import arcpy
import time

# Set envvironment
arcpy.env.workspace = r"E:\DensityMaps\DensityMapsTest1.gdb"
arcpy.env.overwriteOutput = True

# Set timer
from datetime import datetime
startTime = datetime.now()

# Set local variables
inFeatures = [r"E:\DensityMaps\DensityMapsTest.gdb\Grid1km_Clip", "JanuaryLines2"]
outFeatures = "JanuaryLinesIntersect"
outType = "LINE"

# Make lines
arcpy.Intersect_analysis(inFeatures, outFeatures, "", "", outType)

#Print end time
print "Finished "+str(datetime.now() - startTime)


내 질문은 : CPU를 100 %로 작동시키는 방법이 있습니까? 항상 25 %로 실행됩니다. 프로세서가 100 %이면 스크립트가 더 빨리 실행될 것 같습니다. 틀린 추측?
내 기계는 :

  • Windows Server 2012 R2 표준
  • 프로세서 : Intel Xeon CPU E5-2630 0 @ 2.30 GHz 2.29 GHz
  • 설치된 메모리 : 31,6 GB
  • 시스템 유형 : 64 비트 운영 체제, x64 기반 프로세서


여기에 이미지 설명을 입력하십시오


멀티 스레딩을 사용하는 것이 좋습니다. 그것은 설정하기가 쉽지는 않지만 노력을 보상하는 것 이상입니다.
alok jha

1
다각형에 어떤 종류의 공간 인덱스를 적용 했습니까?
Kirk Kuykendall

1
또한 ArcGIS Pro와 동일한 작업을 시도 했습니까? 64 비트이며 멀티 스레드를 지원합니다. Intersect를 여러 스레드로 나눌만큼 똑똑하지만 시도해 볼 가치가 있다면 놀랐습니다.
Kirk Kuykendall

다각형 피처 클래스에는 FDO_Shape라는 공간 인덱스가 있습니다. 나는 이것에 대해 생각하지 않았다. 다른 것을 만들어야합니까? 이것으로 충분하지 않습니까?
Manuel Frias

1
많은 RAM이 있으므로 다각형을 메모리 내 피쳐 클래스로 복사 한 다음 선과 교차하려고 했습니까? 또는 디스크에 보관하는 경우 압축을 시도 했습니까? 아마도 압축은 i / o를 향상시킵니다.
Kirk Kuykendall

답변:


13

귀하의 CPU에는 4 개의 코어가 있으므로 25 %의 CPU 사용량은 1 개의 코어 사용률과 3 개의 유휴 코어입니다.

따라서 솔루션 만 코드를 다중 스레드로 만드는 것이지만 간단한 작업은 아닙니다.


4
그가 언급CPU 는 6 개의 코어와 12 개의 스레드를 사용합니다.
Kersten

5
안녕하세요, 저는 공감할 수 없지만하고 싶습니다! 파이썬은 불행히도 GIL을 가지고 있으므로 멀티 스레드를 전혀 할 수 없습니다 (실제로 스레드가 시스템 콜을 차단할 때 GIL을 잠금 해제하는 것이 가장 좋습니다)
Alec Teal

2
@AlecTeal 예를 들어 Jython 또는 multiprocessing모듈을 사용하면 확실히 할 수 있습니다 .
rightfold

@elyse 진행 "아, 그래, 자이 썬을 의미한다면 파이썬에서 완전히 할 수있다"는 중요하지 않다. 멀티 프로세싱을 살펴 봐야하는데, 수입품이 파이썬 파이썬을 만드는 것을 재 구현할 힘이 있을까요?
Alec Teal

@AlecTeal 프로세스를 생성합니다 (병렬 처리를 수행하는 한 가지 방법 임). multiprocessing모듈 의 설명서를 참조하십시오 .
rightfold

13

이것이 CPU 바운드 작업인지 확실하지 않습니다. 나는 그것이 I / O 바운드 작업이라고 생각하므로 액세스 할 수있는 가장 빠른 디스크를 사용하려고합니다.

E :가 네트워크 드라이브 인 경우이를 제거하는 것이 첫 번째 단계입니다. 고성능 디스크가 아닌 경우 (<7ms 탐색), 두 번째입니다. 다각형 레이어를 in_memory작업 영역에 복사하면 이점이 있지만 다각형 기능 클래스의 크기와 64 비트 백그라운드 처리 사용 여부에 따라 이점이있을 수 있습니다.

I / O 처리량 최적화는 종종 GIS 성능의 핵심이므로 CPU 미터에 대한 관심을 줄이고 네트워크 및 디스크 미터에 더 많은 관심을 기울이는 것이 좋습니다.


4

나는 arcpy 스크립트와 관련하여 비슷한 성능 문제가 있었으며, 주요 병목 현상은 CPU가 하드 드라이브가 아니라 최악의 시나리오의 네트워크에서 데이터를 사용하는 경우 데이터를 SSD 드라이브로 이동 한 다음 명령 줄에서 스크립트를 시작하십시오. pyscripter가 아닌 pyscripter는 디버깅 속도가 약간 느려서 약간 느릴 수 있습니다. 다시 만족하지 않으면 스크립트 병렬화에 대해 생각하십시오. 각 Python 스레드에는 하나의 CPU 코어가 필요하고 CPU에는 6 코어가 있으므로 시작할 수 있습니다 동시에 6 개의 스크립트.


3

파이썬을 사용하고 위에서 제안한 것처럼 문제를 병렬로 실행할 수 있으면 멀티 프로세싱을 사용하는 것이 좋습니다.

지오넷 웹 사이트에서 파이썬 스크립트를 모델 빌더 내에서 사용할 수있는 파이썬 스크립트 도구로 변환하는 것에 관한 작은 기사를 썼습니다. 이 문서는 코드를 나열하고 코드를 스크립트 도구로 실행하기위한 몇 가지 함정을 설명합니다. 이것은 찾기 시작하는 한 곳입니다.

https://geonet.esri.com/docs/DOC-3824


이것은 갈 길입니다! 스크립트가 제대로 작동하지만 스크립트에서 작동하도록 수정하는 방법을 모르겠습니다. 더 나은, 나는 다각형과 선으로 테이블 교차로를 생각하고있었습니다. 어떤 생각?
Manuel Frias

3

앞서 언급했듯이 멀티 프로세싱 이나 스레딩 을 사용해야합니다 . 그러나 여기에주의가있다 : 문제는 나눌 수 있어야한다! https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms를 살펴보십시오 .

문제가 나눌 수 있으면 다음과 같이 진행하십시오.

  • 프로세스 / 스레드에 대한 입력 데이터를 저장할 큐를 만듭니다.
  • 결과가 저장된 대기열을 만듭니다.
  • 문제를 해결하는 프로세스 / 스레드로 사용할 수있는 함수 또는 클래스 만들기

그러나 geogeek이 말했듯이 CPU 제한 문제가 아니라 IO 문제 일 수 있습니다. 충분한 RAM이 있으면 모든 데이터를 미리로드 한 다음 처리 할 수 ​​있습니다. 즉, 한 번에 데이터를 읽을 수 있으므로 항상 계산 프로세스가 중단되지는 않습니다.


3

21513 라인과 498596 다각형을 사용하여 테스트하기로 결정했습니다. 이 스크립트를 사용하여 다중 프로세서 접근 방식 (시스템의 12 개 프로세서)을 테스트했습니다.

import arcpy,os
import multiprocessing
import time
t0 = time.time()
arcpy.env.overwriteOutput = True
nProcessors=4
folder=r'd:\scratch'

def function(inputs):
        nGroup=inputs[0]
        pGons=inputs[1]
        lines=inputs[2]
        outFeatures = '%s%s%s_%i.shp' %(folder,os.sep,'inters',nGroup)
        fids= tuple([i for i in range(nGroup,500000,nProcessors-1)])
        lyr='layer%s'%nGroup
        query='"FID" in %s' %str(fids)
        arcpy.MakeFeatureLayer_management(pGons,lyr,query)
        arcpy.Intersect_analysis([lines,lyr], outFeatures)
        return outFeatures
if __name__ == "__main__":
        inPgons='%s%s%s' %(folder,os.sep,'parcels.shp')
        inLines='%s%s%s' %(folder,os.sep,'roads.shp')
        m,bList=0,[]
        for i in range(nProcessors):
                bList.append([i,inPgons,inLines])
        pool = multiprocessing.Pool(nProcessors-1)
        listik=pool.map(function, bList)
##      apply merge here
        print listik
        print ('%i seconds' %(time.time()-t0))

결과, 초 :

  • 일반 로컬 하드 드라이브-191
  • 초고속 로컬 드라이브-220
  • 네트워크 드라이브-252

mxd의 지오 프로세싱 도구를 사용하면 87 초 밖에 걸리지 않습니다. 아마도 수영장에 대한 접근 방식에 문제가있을 것입니다 ...

보시다시피 (0, 4, 8,12… 500000)에서 추악한 쿼리 FID를 사용하여 작업을 나눌 수있게했습니다.

미리 계산 된 필드를 기반으로하는 쿼리 (예 : CFIELD = 0)는 시간을 크게 단축시킬 수 있습니다.

또한 멀티 프로세싱 도구에서보고 한 시간이 크게 다를 수 있다는 것을 알았습니다.


1
예, 잠금 문제와 함께 제공되는 목록을 사용하고 있습니다. multiprocessing.queue를 시도하십시오. 또한 작업자 프로세스에서 내용을 쓰지 말고 쓰려는 데이터로 출력 큐를 작성하고 작성기 프로세스에서이를 수행하도록하십시오.
Benjamin

3

나는 PyScripter에 익숙하지 않지만 CPython에 의해 뒷받침된다면 문제 자체가 나눌 수있는 한 (다른 사람들이 이미 언급했듯이) 멀티 스레딩을하지 않아야합니다.

CPython에는 Global Interpreter Lock이 있어 여러 스레드가 귀하의 경우에 가져올 수있는 모든 이점을 제거합니다 .

다른 맥락에서 파이썬 스레드는 유용하지만 CPU에 묶여있는 경우에는 유용하지 않습니다.


1

내 질문은 : CPU를 100 %로 작동시키는 방법이 있습니까?

CPU에 코어가 여러 개 있으므로 프로세스가 실행중인 코어 만 최대로 사용합니다. Xeon 칩 구성 방법에 따라 최대 12 개의 코어 (하이퍼 스레딩이 설정된 6 개의 물리적 및 6 개의 가상)가 실행됩니다. 64 비트 ArcGIS조차도 실제로이를 이용할 수 없으므로 단일 스레드 프로세스가 실행중인 코어를 최대로 사용할 때 CPU 제한이 발생할 수 있습니다. 코어 전체에로드를 분산 시키려면 멀티 스레드 응용 프로그램이 필요합니다. 또는 훨씬 더 간단하게 처리량을 높이기 위해 CPU가 실행중인 코어 수를 줄일 수 있습니다.

CPU 제한을 중지하고 디스크 i / o 제한이 아닌 CPU 제한인지 확인하는 가장 쉬운 방법은 Xeon의 BIOS 설정을 변경하여 하나의 거대한 단일 코어로 설정하는 것입니다. 성능이 크게 향상됩니다. 이것은 또한 PC의 멀티 태스킹 능력을 상당히 상쇄한다는 점을 명심하십시오.이를 구현할 전용 프로세스 머신이 있다면 가장 좋습니다. 대부분의 ArcGIS Desktop 기능 (10.3.1)은 어쨌든 지원하지 않는 코드를 멀티 스레딩하는 것보다 훨씬 간단합니다.


CPU를 "하나의 거대한 단일 코어"로 바꾸려면 어떤 설정을 찾아야합니까?
Alex McVittie

1
정확한 메뉴는 BIOS 및 칩 펌웨어에 따라 다르지만 일반적으로 BIOS 메뉴 설정> 고급> CPU 구성에 있습니다. 하이퍼 스레딩을 끄고 활성화 할 코어 수를 설정하려고합니다. 0은 일반적으로 모두-하나의 큰 코어를 원하면 1로 설정됩니다. 사물을 변경하기 전에 설정을 기록해 두는 것이 좋습니다. 사물이 제대로 작동하지 않을 때는 명확하지만 간과하기 쉽습니다.
kingmi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.