멀티 프로세싱 오류-ArcGIS 구현


13

커뮤니티의 다른 누군가가 공간 분석을 위해 다중 처리를 사용하려고했는지 궁금합니다. 즉, 일련의 래스터를 반복하고 각각에 대해 다중 처리 작업을 만들고 하나의 def 함수 내에서 여러 지리 처리 단계를 통해 실행하려고합니다. 라인을 따라 뭔가

def net(RasterImage, OutFolderDir):
    arcpy.env.overwriteOutput = True  
    arcpy.env.workspace = OutFolderDir 
    DEM_Prj = DEM_Prj.tif

    try:
        arcpy.ProjectRaster_management(RasterImage, DEM_Prj....
        FocalStatistics(DEM_prj....)
        ...

if __name__ == '__main__':  
    InputFolder = r'C:\test\somepath'  
    Output = r'C:\test\somepath2'  
    arcpy.env.workspace = InputFolder  
    arcpy.env.scratchWorkspace = r'C:\test.gdb'    

    fcs = arcpy.ListRasters('*')
    pool = multiprocessing.Pool(4)   
    jobs = []                 
    for fc in fcs:
        rIn = os.path.join(InputFolder,fc)
        rOut = os.path.join(Output,fc[:-4])
        jobs.append(pool.apply_async(net,(rIn, rOut)))    

이제 멀티 프로세싱이 일반적으로 첫 번째 배치에서 실행됩니다! 그러나 다음을 포함하여 여러 데이터 세트 (4 개 이상의 파일-4 코어 멀티 프로세싱)를 시도 할 때 여러 가지 다른 오류가 계속 발생합니다.

ERROR 010302: Unable to create the output raster: C:\somepath\sr6f8~1\FocalSt_srtm1
ERROR 010067: Error in executing grid expression.
Failed to execute (FocalStatistics).

ERROR 999999: Error executing function.
Failed to copy raster dataset
Failed to execute (ProjectRaster)

첫 번째 오류에서 최종 출력의 정확한 복제본을 거의 생성하는 초점 통계와 연관된 이상한 폴더 (OutFolderDir 위치에)가 생성됩니다.

내 질문은 귀하의 경험을 기반으로합니다. 하나의 다중 처리 기능 내에서 여러 단계의 지리 처리를 만드는 것이 불가능합니까? 아니면이 단계들을 개별 지오 프로세싱 단계로 타일링해야합니까?

최신 정보

비슷한 오류가 계속 발생합니다-가져 오기 기능을 def 기능으로 옮기면

import arcpy 
from arcpy.sa import *

import *가 허용되지 않는다는 구문 경고가 추가 된 출력을 작성할 수 없습니다.

업데이트 # 2

나는 이것이 답이 늦다는 것을 알고 있지만, 다중 처리가 아크 피와 함께 작동 할 수 있도록 내 대안을 참조 할 때 다른 사람에게 도움이 될 것이라고 생각했습니다. 이 문제로 돌아온 후 발견 한 주요 문제는 arcpy 모듈의 경쟁이 아니라 ArcObjects가 임시 파일을 저장하는 데 사용하는 scratchWorkspace와의 경쟁입니다. 따라서 멀티 프로세싱 구문 분석 인수에 카운터를 실행하여 각 프로세스에 대해 고유 한 scratchWorkspace를 작성하는 것이 좋습니다.

Counter = 0 
for fc in fcs:              
    rIn = os.path.join(InputFolder,fc)              
    rOut = os.path.join(Output,fc[:-4])                    
    jobs.append(pool.apply_async(net,(rIn, rOut,Counter)))            
    Counter += 1

그런 다음 기본 기능에서 특정 임시 디렉토리를 작성하고 각 다중 처리 태스크에 고유 한 scratchWorkspace를 지정하십시오.

def main(RasterImage,OutFolderDir,Counter)      
    TempFolder = os.path.join(os.path.dirname(OutFolderDir),'Temp_%s'%  (Counter))      
    os.mkdir(TempFolder)      
    arcpy.scratchWorkspace = TempFolder      
    ... 

초기에 별도의 임시 작업 공간을 사용하라는 제안이 Ragi에 도움이 되었기를 바랍니다. 여전히 원래 작동하지 않는 이유 때문에 여전히 당황했습니다.

추가 자료

ESRI 멀티 프로세싱 블로그

Python, Gis 및 Stuff 블로그


이 제안은 너무 조잡하여 답장으로 공식화하고 싶지 않지만 여러 가상 머신에서 동시에 ArcGIS를 실행하는 것을 고려하고 있습니까? (각각 자체 디렉토리 구조를 가진 각 VM에 별도의 설치가 필요할 수 있습니다.) 또 다른 근본적인 생각은 일부 처리를 정리하는 것입니다 R. 예를 들어 focalstats는에서 수행 할 수 있습니다 . 이것들은 가치가있는 것보다 문제가 많기 때문에 범용 작업에 대한 좋은 제안은 아니지만 한 번에 시간을 절약 할 수있을 때 반복적으로 노력하면 보상을받을 수 있습니다.
whuber

답변:


7

각 IWorkspace 연결 (즉, 각 데이터베이스 연결)에는 스레드 선호도가 있습니다. 두 스레드는 동일한 작업 공간을 공유 할 수 없습니다. 하나의 스레드가 리소스를 소유 한 다음 액세스를 동기화 할 수 있지만 straight gp 함수를 사용하려는 경우에는 옵션이 아닙니다.

가장 쉬운 방법은 별도의 프로세스를 만든 다음 멀티 스레드 동기화와 달리 다중 프로세스 동기화를 수행하는 것입니다. 그럼에도 불구하고 기본 작업 공간 유형을 알고 있어야합니다. arcsde (다중 사용자 데이터 소스)를 사용하지 않는 경우 개인 또는 filegdb와 같은 단일 사용자 데이터 소스를 사용하게됩니다. 그런 다음 한 번에 하나의 프로세스 만 작성할 수 있음을 기억하십시오! 이러한 시나리오에 대한 일반적인 (불충분 한) 동기화는 각 병렬 프로세스가 다른 임시 작업 영역에 쓴 다음 단일 프로세스에서 대상 작업 영역으로 모두 병합한다는 것입니다.


권장 사항 ... 실제로이 게시물에 추가하지 않았지만 래스터 이미지 이름을 기반으로 새 폴더를 만들고 각 프로세스의 작업 영역을 해당 특정 디렉토리로 설정합니다. 이들은 각 래스터 이미지에 대한 별도의 파일 디렉토리이며 별도의 지오 데이터베이스가 아닙니다 (필요합니까?). 그런 다음 간단한 os.walk 함수를 사용하여 필요한 모든 파일을 찾고 원하는 파일 지오 데이터베이스로 옮길 계획이었습니다.
BJEBN

래스터 작업 만하고 있습니까? 동일한 지오 데이터베이스에 대한 스레드 / 프로세스 읽기 / 쓰기가 동시에 있습니까?
Ragi Yaser Burhum

안녕하세요, 이전 진술에서 약간 불분명했을 수도 있습니다. 래스터 작업 (재 투영, 초점 조절, 재 분류 등) 만 해당 모든 지리 처리 단계는 각 래스터 이미지에 대해 순차적 인 순서로 수행되어야합니다. 이 래스터 이미지는 고유 한 폴더 작업 공간에 저장됩니다. 모든 원본 래스터는 전송 될 개별 작업을 생성하는 동일한 디렉토리 (동일한 이미지는 아님)에서 읽습니다.
BJEBN

다소 생각한 후에 각 이미지에 대해 특정 스크래치 작업 영역을 지정하려고했습니다. DEM이 올바르게 투사되고 있지만 focalstats 단계에서 "<Raster> 유형이 지원되지 않습니다"라는 새로운 오류가 발생했습니다. 전체 디렉토리 주소를 지정하려고 시도했지만 운이 없습니다. 투영 된 래스터를 문제없이 arcgis에로드했습니다.
BJEBN

글쎄, 그것은 당신이 앞으로 나아가고 있다는 것을 의미합니다. focalstat의 경우 내부 구현 방식에 따라 다릅니다. 새로운 구현 인 경우 스크래치 워크 공간 (예 : 지오 데이터베이스)이 필요할 수 있습니다. 그러나 아직 업그레이드되지 않은 기능 중 하나 (!?!?!) 인 경우 허용되는 작업 공간은 폴더 일 수 있습니다. 특정 GP 기능의 경우 폴더 만 지정하고 (나머지에 대한 스크래치 작업 공간 유지) 어떤 일이 발생하는지 확인하십시오.
Ragi Yaser Burhum

5

동일한 리소스를 놓고 경쟁하는 여러 스레드가 있습니다.

'가져 오기 가져 오기'문을 멀티 프로세싱 대상으로 이동하십시오. arcpy가 자체 환경 변수 및 메모리 세트와 함께 작동하는지 확인하십시오.

터무니없이 들리지만 Multiprocess 대상 방법에서 환경 변수를 설정하더라도 파이썬은 여전히 ​​공유 메모리 공간을 사용하여 arcpy 모듈 및 설정 한 모든 변수를 관리합니다.

Arcpy는 스레드 안전하지 않습니다. 항상 단일 프로세스 내에서 사용되도록 고안되었습니다. 그러나 해결 방법이 있습니다.


내 제안은 새로운 프로세스를 위해 대상 내에서 arcpy를 가져 오는 것이 었습니다.

def _multiprocessing_target(args):
    import arcpy
    ...code

안녕하세요, 귀하의 조언에 감사드립니다 ... 여전히 문제가있는 것으로 보입니다. '멀티 프로세싱의 대상으로 arcpy 가져 오기'를 언급 할 때는 if__name ... 문 또는 실제로 def 함수 내에 있음을 나타냅니다. def 함수에서 가져 오기가 유효하지 않다고 생각했습니다.
BJEBN
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.