python.multiprocessing dan “FATAL ERROR (INFADI) DIRECTORY MISSING”

9

Saat mencoba melakukan multiprocessing dengan arcpy, saya sesekali mengalami kesalahan ini:

FATAL ERROR (INFADI)
MISSING DIRECTORY

Saya tidak tahu apa yang memicu kesalahan ini, dan itu crash proses python, sehingga tidak mungkin untuk mendapatkan traceback di atasnya. Ini terjadi saat menulis output raster akhir dari model suara yang panjang.

Terkadang disertai dengan kesalahan

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

Di mana% Temp diurai koreksi dan #### adalah beberapa angka acak 4 digit. Ini tidak biasa karena setiap proses memiliki ruang kerja sendiri, di mana sebagian besar file harus ditulis.

Masalahnya bukan data input ... Saya bisa menjalankan kembali program pada input yang gagal dan itu akan berjalan dengan benar.

tuan-castillo
sumber
Saya akan kembali ke yang ini segera, tetapi harus bekerja pada model yang berbeda sekarang.
blord-castillo

Jawaban:

6

Berikut beberapa hal yang perlu diperiksa:

Apakah Anda menggunakan kursor? Apakah Anda melepaskannya? Apakah Anda mencoba menggunakan kembali objek apa pun dalam proses yang berbeda? Apakah Anda berbagi lokasi temp yang sama? Apakah Anda melakukan pemrosesan memori?

Secara umum, arcpy hanyalah pembungkus di sekitar objek com dan semua jenis multiprocessing akan rumit.

Jamie
sumber
4

Saya menemukan masalah ini muncul ketika arcpy.env.workspace dan arcpy.env.scratchWorkspace adalah sama untuk dua proses yang berbeda. Arc menulis hampir semua raster menengah ke ruang kerja (atau ruang kerja awal) dalam format ESRI GRID. Anda tidak dapat menulis dua raster ESRI GRID ke direktori yang sama pada saat yang sama karena struktur pseudo-database format (folder info menyimpan kunci unik untuk setiap raster).

Saya telah menghindari kesalahan ini dengan menetapkan ruang kerja unik dan scratchWorkspace untuk setiap proses menggunakan folder tempfile.mkdtemp sementara.

jonah
sumber
Saya sudah menggunakan ruang kerja yang unik, tapi saya akan memeriksa bahwa scratchWorkspace juga unik. Saya kira tidak karena ini menulis ke direktori% TEMP%.
blord-castillo
Yunus benar. Saya sedang memproses ribuan raster dalam satu direktori di 5 utas simultan; pengaturan ruang kerja awal yang unik untuk masing-masing adalah satu-satunya solusi yang berhasil bagi saya. Mengeluarkan ke folder unik, seperti yang direkomendasikan beberapa orang, hanya menciptakan lebih banyak pekerjaan untuk nanti ... akhirnya saya ingin mereka semua berada di direktori yang sama.
Tom
Betapa menyakitkan di bagian belakang! Menggunakan ruang kerja awal yang unik dengan multiprosesor berhasil, tetapi ya Tuhan, mengelola folder tambahan dan kemudian mencoba menghapusnya dengan kunci lengket adalah konyol !!
D_C
3

Saya juga mengalami ini dan belum menemukan perbaikan suara. Pekerjaan saya adalah 1) untuk memastikan bahwa tugas multiprosesing cukup kuat untuk memeriksa apakah tugas selesai atau tidak, kemudian membuat daftar pekerjaan baru. 2) jadwalkan dua skrip untuk diluncurkan setiap 10-15 menit. Satu skrip berisi perintah untuk mematikan proses python yang sedang berjalan dan yang kedua meluncurkan kembali skrip multiprosesing yang diinginkan. Pada dasarnya, ini menyegarkan kumpulan multi-pemrosesan. Skrip kill adalah sesuatu seperti ini:

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

Setiap peluncuran skrip yang diinginkan saya minta ia menulis PID-nya ke csv.

metasequoia
sumber
2

Saya menemukan bahwa saya mendapatkan kesalahan INFADI ketika mencoba memiliki beberapa utas / inti simpan dan modifikasi raster dalam satu folder. Menugaskan subfolder untuk setiap tugas untuk keluaran tampaknya menyelesaikan masalah. Saya percaya bahwa masalahnya ada pada beberapa baca / tulis ke file perangkat yang terkait dengan raster (misalnya folder "info"). Saya sekarang juga menerapkan tindakan pencegahan berikut:

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()
metasequoia
sumber
Saya sepertinya tidak pernah mendapatkan kesalahan dari menulis beberapa GRID ke folder yang sama melalui beberapa utas. Satu-satunya masalah tampaknya adalah bahwa memperlambat proses dan hampir membatalkan threading, karena hanya menulis satu raster pada satu waktu.
Tom