Разделить много растровых ArcGIS параллельно с использованием многопроцессорности Python
Я хочу разбить 10 изображений на 2 части каждый (20 результирующих изображений). Изображения представляют собой 4-полосные (R, G, B, nIR) изображения NAIP, доступные на этом веб-сайте. Я использую пакет arcpy
из ArcGIS для разделения одного изображения за раз:
import arcpy, os
inws = r'D:\temp\temp_NAIP' #Contains ~10 .tif images
outws = r'D:\temp\temp_NAIP_tiles'
arcpy.env.workspace = inws
rasters = arcpy.ListRasters()
for ras in rasters:
arcpy.SplitRaster_management(
ras, outws,
os.path.basename(ras).split('.')[0],
split_method='NUMBER_OF_TILES',
format='TIFF',
num_rasters='1 2',
overlap=50, units='PIXELS)
Как я могу интегрировать модуль multiprocessing
в вышеупомянутый скрипт для обработки, скажем, 4 изображений за раз?
Кстати, я знаю сообщение в блоге, которое объединяет multiprocessing
и arcpy
, хотя примеры специфичны для векторных данных, и я не могу понять, как использовать инструменты для обработки изображений.
Запрет любых проблем с совместным использованием ресурсов, преобразование простого для цикла в многопроцессорное обслуживание легко сделать с помощью multiprocessing.Pool
. Попробуйте что-то вроде этого:
from multiprocessing import Pool
import arcpy, os
inws = r'D:\temp\temp_NAIP' #Contains ~10 .tif images
outws = r'D:\temp\temp_NAIP_tiles'
arcpy.env.workspace = inws
rasters = arcpy.ListRasters()
def process_img(ras):
arcpy.SplitRaster_management(
ras, outws,
os.path.basename(ras).split('.')[0],
split_method='NUMBER_OF_TILES',
format='TIFF',
num_rasters='1 2',
overlap=50, units='PIXELS')
pool = Pool(processes=4)
pool.map(process_img, rasters)
Пока rasters
являются итерируемыми, они должны быть сопоставлены с пулом процессов. Имейте в виду, что каждый процесс будет "наследовать" стек родительского процесса, так что каждый процесс будет использовать его собственную копию arcpy.env.workspace
.