Мені було цікаво, чи хтось із спільноти тут намагався використати багатопроцесорну обробку для просторових аналізів. А саме я намагаюся повторити ряд растрових даних, створити багатопроцесорне завдання для кожного та запустити їх через декілька етапів геообробки в межах однієї функції 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 *
не може створити вихід із доданим синтаксичним попередженням, що імпорт * не дозволений.
ОНОВЛЕННЯ №2
Я знаю, що це несвоєчасна відповідь, але я подумав, що це може принести користь комусь іншому для подальшого посилання на мій спосіб вирішення, який дозволяє багатопроцесорній роботі працювати з arcpy. Основна проблема, яку я виявив після повернення до цієї проблеми, - це не конкуренція модулів arcpy, а скоріше конкуренція за програму scratchWorkspace, яку ArcObjects використовують для збереження тимчасових файлів. Тому розглянемо запуск лічильника в аргумент багатопроцесорного синтаксичного аналізу для створення унікального простору нуля для кожного процесу, тобто
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
Потім в основній функції складіть конкретний тимчасовий каталог і призначте унікальну область скретчорксів для кожного багатопроцесорного завдання.
def main(RasterImage,OutFolderDir,Counter)
TempFolder = os.path.join(os.path.dirname(OutFolderDir),'Temp_%s'% (Counter))
os.mkdir(TempFolder)
arcpy.scratchWorkspace = TempFolder
...
Сподіваємось, що це допомагає і дякує Рагі за первісну пропозицію використовувати окремі робочі простори temp - все ще викликає здивування, чому це спочатку не працювало.
Додаткові ресурси
R. Це не гарні пропозиції для роботи загального призначення, оскільки вони можуть мати більше клопотів, ніж вони коштують, але коли ви можете заощадити години за один раз, багато разів, зусилля можуть окупитися.