2017-01-19 1 views
1

스크립트의 함수에서 다중 처리를 사용하려고하는데 다중 처리를위한 구조 및 구문에 문제가 있다고 생각합니다. 여기서 목표는 목록을 반복하고 13 개의 서로 다른 공간 지오 데이터베이스의 래스터/tiff 이미지를 복사하는 것입니다. 출력과 입력 모두 개별 지오 데이터베이스에 저장되어 프로세스 속도를 높이고 충돌을 방지합니다. 다음은 예제 스크립트입니다.python 스크립트의 다중 처리 기능

import arcpy, time, os 
from arcpy import env 
import multiprocessing 
from multiprocessing import pool 

def copy_rasters_3b(P6_GDBs, x, c): 
     mosaic_gdb = os.path.join('{}/mosaic_{}.gdb/{}'.format(P6_GDBs, x, c)) 
     final_gdb = os.path.join('{}/final_{}.gdb/{}'.format(P6_GDBs, x, c)) 
     final_tiff = os.path.join('{}/{}.tif'.format(P6_GDBs, c)) 
     print "---Copying Rasters Started---" 
     start_time = time.time() 
     arcpy.CopyRaster_management(mosaic_gdb, final_gdb, "", "", "", "NONE", "NONE", "8_BIT_UNSIGNED", "NONE", "NONE", "", "NONE") 
     arcpy.CopyRaster_management(mosaic_gdb, final_tiff, "", "", "", "NONE", "NONE", "8_BIT_UNSIGNED", "NONE", "NONE", "TIFF", "NONE") 
     print("--- "+ c + " Complete %s seconds ---" % (time.time() - start_time)) 

### Main ### 
def main(): 
    P6_DIR= "D:/P6_SecondRun" 
    P6_GDBs= "D:/P6_GDBs" 
    Categories =['CRP', 'FORE', 'INR', 'IR', 'MO', 'PAS', 'TCI', 'TCT', 'TG', 'WAT', 'WLF', 'WLO', 'WLT'] 
    rasters = defaultdict(list) 

    # Environments 
    arcpy.env.overwriteOutput = True 
    arcpy.env.snapRaster = "D:/A__Snap/Phase6_Snap.tif" 
    arcpy.env.outputCoordinateSystem = arcpy.SpatialReference(102039) #arcpy.SpatialReference(3857) 

    pool = multiprocessing.Pool(processes=5) 

    for c, x in zip(Categories, range(1,14)): 
     pool.map(copy_rasters_3b(P6_GDBs, x, c), 14) 
     pool.close() 

############### EXECUTE MAIN() ############### 
if __name__ == "__main__": 
    main() 

이 스크립트는 백그라운드에서 5 개의 프로세스를 시작하지만 처음 두 인스턴스 후에는 결국 실패합니다. 저는 ArcMap 10.4 x64를 실행 중이며 Python27-64 비트로 작업하고 있습니다.

답변

1

먼저 함수 및 함수에 대한 인수를 제공하는 반복 가능한 함수를 사용하여 pool.map (한 번)을 호출해야합니다. 그 이유는 서브 프로세스 인에 실제 함수 호출이 이되도록하기 위해서입니다. 대신 실제로 함수를 직접 호출하고 그 결과를 유용하지 않은 pool.map으로 전달합니다.

두 번째로 루프 내부에서 pool.close을 호출하고 다음 반복에서 pool.map을 다시 호출해야합니다. 풀 객체의 패턴은 모든 작업을 제출하는 것입니다. 모든 작업이 완료 될 때까지 기다렸다가 완료되면 pool.close으로 전화하십시오. 이 경우, 모든 작업은 단일 .map 메소드 호출을 통해 모든 작업에 제공됩니다. 그래서 enumerate(Categories) N은 목록의 위치가 튜플 (N, member)의 번호 세트를 생산하고, Categories 문자열의 목록입니다

def copy_rasters_3b(arg_tuple): 
    P6_GDBs, x, c = arg_tuple # Break apart argument tuple 
    ... # Rest same as before 

pool = multiprocessing.Pool(processes=5) 
pool.map(copy_rasters_3b, [(P6_GDBs, x, c) for x, c in enumerate(Categories)]) 
pool.close() 

목록 이해를 깨는 :

코드를 다음과 같이 보일 수 있습니다 member는 목록의 값입니다. 이 두 값을 각 결과 튜플의 상수 값 P6_GDB와 결합합니다. 이해의 최종 결과는 3 튜플의 목록입니다.

map은 각 호출의 함수에 대한 iterable 인수에서 단일 요소를 제공합니다. 그러나 그 단일 요소는 3- 튜플이므로 여기서 함수는 하나의 인수를 구성 요소로 분리해야합니다.

마지막으로 다음 가져 오기 선을 혼동 스럽거나 불필요하게 삭제해야합니다. 여기서 이름을 pool으로 가져 오지만 나중에 (사용하지 않고) 가져 오려면 변수 이름으로 pool에 할당하여 새 값으로 겹치십시오.

from multiprocessing import pool 
[...] 
pool = multiprocessing.Pool(processes=5) 
관련 문제