python.multiprocessing e "FATAL ERROR (INFADI) MISSING DIRECTORY"


9

Durante il tentativo di eseguire il multiprocessing con arcpy, di tanto in tanto mi imbatto in questo errore:

FATAL ERROR (INFADI)
MISSING DIRECTORY

Non ho idea di cosa stia scatenando questo errore e si blocca il processo Python, rendendo impossibile ottenere un traceback su di esso. Si verifica durante la scrittura dell'uscita raster finale da un lungo modello audio.

A volte è accompagnato da un errore

Unable to write BND file for %TEMP%\ras####

Dove% Temp è analizzato correttamente e #### è un numero casuale di 4 cifre. Questo è insolito perché ogni processo ha il suo spazio di lavoro, che è dove la maggior parte dei file dovrebbe essere scritta.

Il problema non sono i dati di input ... Posso rieseguire il programma sugli input non riusciti e funzionerà correttamente.


Tornerò presto su questo, ma devo lavorare su un modello diverso in questo momento.
— blord-castillo,

Risposte:


6

Ecco alcune cose da controllare:

Stai usando i cursori? Li stai rilasciando? Stai cercando di riutilizzare qualsiasi oggetto in diversi processi? Stai condividendo la stessa posizione temporanea? Stai eseguendo l'elaborazione della memoria?

In generale, arcpy è solo un involucro attorno agli oggetti com e qualsiasi tipo di multiprocessing sarà complicato.


4

Ho riscontrato che questo problema si presenta quando arcpy.env.workspace e arcpy.env.scratchWorkspace sono uguali per due processi diversi. Arc scrive quasi tutti i raster intermedi nell'area di lavoro (o area di lavoro scratch) nel formato ESRI GRID. Non è possibile scrivere due raster ESRI GRID contemporaneamente nella stessa directory a causa della struttura pseudo-database del formato (la cartella delle informazioni contiene chiavi univoche per ciascun raster).

Ho evitato questo errore assegnando spazio di lavoro unico e scratchWorkspace per ogni processo usando una cartella temporanea tempfile.mkdtemp.


Uso già aree di lavoro uniche, ma ricontrollerò che scratchWorkspace sia unico. Suppongo che non stia scrivendo alla directory% TEMP%.
— blord-castillo,

Jonah ha ragione. Sto elaborando migliaia di raster in una singola directory attraverso 5 thread simultanei; impostare uno spazio di lavoro scratch unico per ognuna è l'unica soluzione che ha funzionato per me. L'output in cartelle univoche, come alcuni hanno raccomandato, crea solo più lavoro per dopo ... alla fine li voglio tutti nella stessa directory.
— Tom,

Che dolore nella parte posteriore! Usare lo spazio di lavoro scratch unico con il multiprocessing ha funzionato, ma mio Dio, gestire le cartelle extra e quindi provare a eliminarle con blocchi arcpy è ridicolo !!
— D_C,

3

Ho riscontrato anche questo e non ho ancora trovato una soluzione audio. Il mio lavoro è 1) per assicurarmi che l'attività di elaborazione multipla sia abbastanza solida da verificare se le attività sono complete o meno, quindi creare un nuovo elenco di lavori. 2) programmare due script da avviare ogni 10-15 minuti. Uno script contiene un comando per eliminare determinati processi Python in esecuzione e il secondo riavvia lo script multiprocessing desiderato. In sostanza, questo aggiorna il pool di elaborazione multipla. Il kill script è qualcosa del genere:

def read_pid():
    inFile = open("E:/temp/pid.csv")
    for line in inFile:
        pid = str(line)
    inFile.close()
    return pid

def kill():
    if os.path.exists("E:/temp/pid.csv")==True:
        pid = read_pid()
        PROCESS_TERMINATE=1
        handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE,False,pid)
        ctypes.windll.kernel32.TerminateProcess(handle,-1)
        ctypes.windll.kernel32.CloseHandle(handle)
    else:
        return

Ogni lancio dello script desiderato lo fa scrivere il suo PID su un CSV.



2

Ho scoperto che stavo ricevendo l'errore INFADI durante il tentativo di salvare e modificare più raster in una cartella più thread / core. L'assegnazione di una sottocartella a ciascuna attività per gli output sembra risolvere il problema. Credo che il problema riguardasse più letture / scritture su file periferici associati al raster (ad esempio la cartella "info"). Ora uso anche le seguenti precauzioni:

import arcpy,multiprocessing,random

def run(foo,c):
    tempFolder = os.path.join("Z:/temp/",'temp_%s'%(str(c)))
    if not os.path.exists(tempFolder): os.mkdir(tempFolder)
    arcpy.env.scratchWorkspace = tempFolder
    arcpy.env.Workspace = tempFolder

    # create unique object in memory, run task, then delete unique object in memory
    tempMem = str(rnd)
    try:arcpy.Delete_management(tempMem)
    except:pass

    <tasks> #output to appropriate subfolder

    arcpy.Delete_management(tempMem)

if __name__ == '__main__':
    cores = 3
    pool = multiprocessing.Pool(cores)
    count = 0
    for foo in bar:
        pool.apply_async(run,(foo,c))
        count +=1
    pool.close()
    pool.join()

Non mi sembra mai di ricevere errori dalla scrittura di più GRID nella stessa cartella attraverso più thread. L'unico problema sembra essere che ciò rallenta l'elaborazione e praticamente invalida il threading, poiché scrive solo un raster alla volta.
— Tom,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.