13 votos

Errores multiprocesador - aplicación de ArcGIS

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

ESRI Multiprocesamiento Blog

Python,Sig y Cosas por el Blog

7voto

FlySwat Puntos 61945

Cada IWorkspace conexión i.e cada una conexión de base de datos) ha hilo de afinidad. Dos hilos no pueden compartir el mismo espacio de trabajo. Usted puede tener un hilo propio el recurso y, a continuación, sincronizar el acceso, pero si usted va a estar usando la recta gp funciones, a continuación, que no es ni siquiera una opción.

La forma más fácil (cojo) es crear procesos separados y, a continuación, hacer multi-proceso de sincronización (como opuesto a multithread de sincronización). Incluso entonces usted debe ser consciente de que el subyacente tipo de área de trabajo. si usted no está utilizando de arcsde (multi-usuario del origen de datos) probablemente el uso de un solo usuario del origen de datos (como personal o filegdb). A continuación, recordar lo que significa que sólo un proceso puede escribir en un momento! El típico (lame) la sincronización de estos escenarios es que cada paralelo escribe en un proceso de diferentes temp área de trabajo y luego se mezcla todo en su área de trabajo de destino en un solo proceso.

5voto

Eric Scrivner Puntos 1392

Tienes varios hilos que compiten por el mismo recurso.

Pruebe a mover la importación de arcpy declaración en el destino de la multiprocesamiento. Te asegurarás de arcpy está trabajando con su propio conjunto de variables de entorno y la memoria.

Suena absurdo, pero a pesar de que son la configuración de variables de entorno en el Multiproceso método objetivo, python es todavía el uso de un espacio de memoria compartida para administrar el módulo arcpy y por lo tanto ninguna de las variables se establece.

Arcpy no es seguro para subprocesos. Siempre fue la intención de ser utilizados dentro de un único proceso. Pero no hay soluciones.

ACTUALIZACIÓN

Lo siento por la ambigüedad. Mi sugerencia fue la importación de arcpy dentro de la meta para el nuevo proceso.

def _multiprocessing_target(args):
    import arcpy
    ...code

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X