Podczas próby wykonywania wielu procesów za pomocą Arcpy, od czasu do czasu pojawia się ten błąd:
FATAL ERROR (INFADI)
MISSING DIRECTORY
Nie mam pojęcia, co powoduje ten błąd i powoduje awarię procesu Pythona, uniemożliwiając uzyskanie na nim śledzenia. Występuje podczas pisania końcowego wyniku rastra z długiego modelu dźwięku.
Czasami towarzyszy temu błąd
Unable to write BND file for %TEMP%\ras####
Gdzie% Temp jest parsowane, a #### to losowa 4-cyfrowa liczba. Jest to niezwykłe, ponieważ każdy proces ma własny obszar roboczy, w którym należy zapisać większość plików.
Problemem nie są dane wejściowe ... Mogę ponownie uruchomić program na błędnych danych wejściowych i będzie działał poprawnie.
arcpy
arcgis-10.0
parallel-processing
blord-castillo
źródło
źródło
Odpowiedzi:
Oto kilka rzeczy do sprawdzenia:
Czy używasz kursorów? Wypuszczasz je? Czy próbujesz ponownie użyć obiektów w różnych procesach? Czy udostępniasz tę samą lokalizację tymczasową? Czy zajmujesz się przetwarzaniem pamięci?
Ogólnie rzecz biorąc, arcpy jest tylko owijaniem wokół obiektów com, a każdy rodzaj wieloprocesowości będzie trudny.
źródło
Odkryłem, że ten problem pojawia się, gdy arcpy.env.workspace i arcpy.env.scratchWorkspace są takie same dla dwóch różnych procesów. Arc zapisuje prawie wszystkie pośrednie rastry w obszarze roboczym (lub obszarze roboczym rysowania) w formacie ESRI GRID. Nie można jednocześnie zapisywać dwóch rastrów ESRI GRID w tym samym katalogu ze względu na strukturę pseudo-bazy danych formatu (folder informacyjny zawiera unikatowe klucze dla każdego rastra).
Uniknąłem tego błędu, przypisując unikalny obszar roboczy i scratchWorkspace dla każdego procesu za pomocą tymczasowego folderu tempfile.mkdtemp.
źródło
Zetknąłem się z tym i nie znalazłem jeszcze rozwiązania dźwiękowego. Moje obejście to 1), aby upewnić się, że zadanie wieloprocesowe jest wystarczająco solidne, aby sprawdzić, czy zadania są ukończone, czy nie, a następnie utworzyć nową listę zadań. 2) zaplanuj uruchamianie dwóch skryptów co 10-15 minut. Jeden skrypt zawiera polecenie zabicia wybranych uruchomionych procesów Pythona, a drugi ponownie uruchamia żądany skrypt wieloprocesowy. Zasadniczo odświeża pulę wieloprocesową. Skrypt zabicia jest mniej więcej taki:
Przy każdym uruchomieniu pożądanego skryptu zapisuję jego identyfikator PID do pliku csv.
źródło
Muszę przyznać, że w tym momencie jestem tylko wielowątkowym wahaczem, ale blogiem na https://pythongisandstuff.wordpress.com/2013/07/31/using-arcpy-with-multiprocessing-%E2%80%93-part -3 / sugeruje, że integracja
arcpy.Exists()
funkcji jest kluczem do jej realizacji.źródło
Odkryłem, że dostaję błąd INFADI, gdy próbuję zapisać wiele wątków / rdzeni i zmodyfikować rastry w jednym folderze. Przypisanie podfolderu do każdego zadania dla wyników wydaje się rozwiązać problem. Uważam, że problem dotyczy wielu odczytów / zapisów w plikach peryferyjnych powiązanych z rastrem (np. Folder „info”). Teraz stosuję również następujące środki ostrożności:
źródło