Разделить много растровых ArcGIS параллельно с использованием многопроцессорности Python

57
4

Я хочу разбить 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, хотя примеры специфичны для векторных данных, и я не могу понять, как использовать инструменты для обработки изображений.

спросил(а) 2015-04-10T00:47:00+03:00 5 лет, 5 месяцев назад
1
Решение
57

Запрет любых проблем с совместным использованием ресурсов, преобразование простого для цикла в многопроцессорное обслуживание легко сделать с помощью 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.

ответил(а) 2015-04-17T18:25:00+03:00 5 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема