Me preguntaba si alguien en la comunidad que aquí se ha intentado hacer uso de multi-procesamiento para análisis espaciales. Es decir, yo estoy tratando de iterar a través de una serie de rásteres, crear un multiprocesamiento de trabajo para cada uno y ejecutar a través de un número de geoprocesamiento pasos dentro de una def de la función. Algo a lo largo de las líneas de
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)))
Ahora el multiprocesamiento funciona, normalmente durante el primer lote! Sin embargo, sigo corriendo en varios errores al intentar varios conjuntos de datos(más de 4 archivos - es decir, de 4 núcleos multiprocesamiento), incluyendo:
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).
y
ERROR 999999: Error executing function.
Failed to copy raster dataset
Failed to execute (ProjectRaster)
Aviso en el primer error de la extraña carpeta que se ha creado (en el OutFolderDir ubicación) asociado con el centro de estadísticas que casi crea una réplica exacta de la salida final.
Mi pregunta se basa en su experiencia es imposible crear varios etapa de geoprocesamiento en el plazo de un multiprocesamiento función? O necesito azulejo estos pasos en sus individuales de geoprocesamiento pasos?
Saludos Cordiales, Bjorn
ACTUALIZACIÓN
Todavía encoutering errores similares - moviendo las funciones de importación para la def función ha demostrado que
import arcpy
from arcpy.sa import *
no se puede crear una salida con una sintaxis advertencia de que de importación * no está permitido.
ACTUALIZACIÓN #2
Sé que esto es una respuesta tardía, pero pensé que podría beneficiar a alguien más para referencia en el futuro para mi solución que permite multiprocesamiento para trabajar con arcpy. El principal problema que he encontrado después de regresar a este problema no es de la competencia de la arcpy módulos, sino más bien la competencia por el scratchWorkspace que el ArcObjects utilizar para guardar los archivos temporales. Por lo tanto, considere la posibilidad de ejecutar un contador en el multiprocesamiento de análisis de argumento para hacer una única scratchWorkspace para cada proceso, es decir,
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
A continuación, en la función principal hacer un directorio temporal y asignar un único scratchWorkspace a cada multiprocesamiento tarea.
def main(RasterImage,OutFolderDir,Counter)
TempFolder = os.path.join(os.path.dirname(OutFolderDir),'Temp_%s'% (Counter))
os.mkdir(TempFolder)
arcpy.scratchWorkspace = TempFolder
...
Espero que ayude y gracias a Ragi para la inicial propuesta de utilizar por separado temp de trabajo - todavía desconcertado por qué es originalmente no trabajo.
Recursos Adicionales