Beim Versuch, Multiprocessing mit arcpy durchzuführen, tritt gelegentlich der folgende Fehler auf:
FATAL ERROR (INFADI)
MISSING DIRECTORY
Ich habe keine Ahnung, was diesen Fehler auslöst, und er stürzt den Python-Prozess ab, sodass es unmöglich ist, einen Traceback darauf zu erhalten. Dies tritt beim Schreiben der endgültigen Rasterausgabe eines langen Soundmodells auf.
Es wird manchmal von einem Fehler begleitet
Unable to write BND file for %TEMP%\ras####
Wobei% Temp korrekt analysiert wird und #### eine zufällige 4-stellige Zahl ist. Dies ist ungewöhnlich, da jeder Prozess einen eigenen Arbeitsbereich hat, in den die meisten Dateien geschrieben werden sollten.
Das Problem sind nicht die Eingabedaten ... Ich kann das Programm auf den fehlgeschlagenen Eingaben erneut ausführen und es wird korrekt ausgeführt.
arcpy
arcgis-10.0
parallel-processing
Blord-Castillo
quelle
quelle
Antworten:
Hier sind einige Dinge zu überprüfen:
Verwenden Sie Cursor? Veröffentlichen Sie sie? Versuchen Sie, Objekte in verschiedenen Prozessen wiederzuverwenden? Teilen Sie den gleichen temporären Standort? Machst du in der Speicherverarbeitung?
Im Allgemeinen ist der Arcpy nur ein Wrapper um die COM-Objekte, und jede Art der Mehrfachverarbeitung ist schwierig.
quelle
Ich habe festgestellt, dass dieses Problem auftritt, wenn arcpy.env.workspace und arcpy.env.scratchWorkspace für zwei verschiedene Prozesse identisch sind. Arc schreibt fast alle Zwischenraster im ESRI GRID-Format in den Arbeitsbereich (oder Scratch-Arbeitsbereich). Aufgrund der Pseudodatenbankstruktur des Formats können Sie nicht zwei ESRI GRID-Raster gleichzeitig in dasselbe Verzeichnis schreiben (der Info-Ordner enthält eindeutige Schlüssel für jedes Raster).
Ich habe diesen Fehler vermieden, indem ich jedem Prozess mithilfe eines temporären Ordners tempfile.mkdtemp einen eindeutigen Arbeitsbereich und einen Arbeitsbereich zugewiesen habe.
quelle
Ich bin auch darauf gestoßen und habe noch keinen Soundfix gefunden. Meine Problemumgehung besteht darin, 1) sicherzustellen, dass die Mehrfachverarbeitungsaufgabe robust genug ist, um zu überprüfen, ob die Aufgaben abgeschlossen sind oder nicht, und dann eine neue Jobliste zu erstellen. 2) Planen Sie zwei Skripte, die alle 10-15 Minuten gestartet werden sollen. Ein Skript enthält einen Befehl zum Beenden ausgewählter laufender Python-Prozesse und das zweite startet das gewünschte Multiprozessorskript neu. Dies aktualisiert im Wesentlichen den Multiprozessor-Pool. Das Kill-Skript sieht ungefähr so aus:
Bei jedem Start des gewünschten Skripts muss die PID in eine CSV geschrieben werden.
quelle
Ich muss zugeben, dass ich zu diesem Zeitpunkt nur ein Multithreading-Möchtegern bin, aber ein Blog unter https://pythongisandstuff.wordpress.com/2013/07/31/using-arcpy-with-multiprocessing-%E2%80%93-part -3 / schlägt vor, dass die Integration der
arcpy.Exists()
Funktion der Schlüssel ist, um dies zu erreichen.quelle
Ich habe festgestellt, dass beim Versuch, mehrere Threads / Kerne in einem Ordner zu speichern und zu ändern, der INFADI-Fehler aufgetreten ist. Das Zuweisen eines Unterordners zu jeder Aufgabe für Ausgaben scheint das Problem zu lösen. Ich glaube, dass das Problem mit mehreren Lese- / Schreibvorgängen in Peripheriedateien zu tun hat, die dem Raster zugeordnet sind (z. B. dem Ordner "info"). Ich wende jetzt auch die folgenden Vorsichtsmaßnahmen an:
quelle