Al intentar hacer multiprocesamiento con arcpy, ocasionalmente me encuentro con este error:
FATAL ERROR (INFADI)
MISSING DIRECTORY
No tengo idea de qué está provocando este error, y bloquea el proceso de Python, por lo que es imposible obtener un rastreo en él. Se produce al escribir la salida de trama final de un modelo de sonido largo.
A veces va acompañado de un error.
Unable to write BND file for %TEMP%\ras####
Donde% Temp se analiza correctamente y #### es un número aleatorio de 4 dígitos. Esto es inusual porque cada proceso tiene su propio espacio de trabajo, que es donde se deben escribir la mayoría de los archivos.
El problema no son los datos de entrada ... Puedo volver a ejecutar el programa en las entradas fallidas y se ejecutará correctamente.
arcpy
arcgis-10.0
parallel-processing
castillo-blord
fuente
fuente
Respuestas:
Aquí hay algunas cosas para verificar:
¿Estás usando cursores? ¿Los estás liberando? ¿Estás tratando de reutilizar algún objeto en diferentes procesos? ¿Estás compartiendo la misma ubicación temporal? ¿Estás haciendo procesamiento de memoria?
En general, el arco es solo una envoltura alrededor de los objetos com y cualquier tipo de multiprocesamiento será complicado.
fuente
Encontré que este problema surge cuando arcpy.env.workspace y arcpy.env.scratchWorkspace son iguales para dos procesos diferentes. Arc escribe casi todos los rásteres intermedios en el espacio de trabajo (o espacio de trabajo temporal) en el formato ESRI GRID. No puede escribir dos rásteres ESRI GRID en el mismo directorio al mismo tiempo debido a la estructura de pseudo-base de datos del formato (la carpeta de información contiene claves únicas para cada ráster).
He evitado este error asignando un espacio de trabajo único y scratchWorkspace para cada proceso utilizando una carpeta temporal tempfile.mkdtemp.
fuente
He encontrado esto también y aún no he encontrado una solución de sonido. Mi trabajo es 1) para asegurarme de que la tarea de multiprocesamiento sea lo suficientemente sólida como para verificar si las tareas están completas o no, y luego crear una nueva lista de trabajos. 2) programe dos scripts para que se inicien cada 10-15 minutos. Una secuencia de comandos contiene un comando para eliminar procesos de Python en ejecución seleccionados y la segunda relanza la secuencia de comandos de multiprocesamiento deseada. Básicamente, esto actualiza el grupo de multiprocesamiento. La secuencia de comandos kill es algo como esto:
Cada vez que lanzo el script deseado, hago que escriba su PID en un csv.
fuente
Debo admitir que estoy en este punto, solo un aspirante a múltiples subprocesos, pero un blog en https://pythongisandstuff.wordpress.com/2013/07/31/using-arcpy-with-multiprocessing-%E2%80%93-part -3 / sugiere que la integración de la
arcpy.Exists()
función es clave para que esto suceda.fuente
Descubrí que recibía el error INFADI al intentar que varios hilos / núcleos guardaran y modificaran rásteres en una carpeta. Asignar una subcarpeta a cada tarea para resultados parece resolver el problema. Creo que el problema tenía que ver con múltiples lecturas / escrituras en archivos periféricos asociados con el ráster (por ejemplo, la carpeta "info"). Ahora también empleo las siguientes precauciones:
fuente