python.multiprocessing ve “FATAL HATASI (INFADI) EKSİKLİK REHBERİ”


9

Arcpy ile çoklu işlem yapmaya çalışırken, bazen bu hatayla karşılaşıyorum:

FATAL ERROR (INFADI)
MISSING DIRECTORY

Bu hatayı neyin tetiklediğine dair hiçbir fikrim yok ve python sürecini çökertiyor, bunun üzerine bir iz bırakmayı imkansız hale getiriyor. Uzun bir ses modelinden son tarama çıktısı yazılırken ortaya çıkar.

Bazen bir hata eşlik eder

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

% Temp düzeltilmiş olarak ayrıştırılır ve #### rastgele bir 4 basamaklı sayıdır. Bu olağandışı bir durumdur, çünkü her işlemin çoğu dosyanın yazılması gereken kendi çalışma alanı vardır.

Sorun giriş verisi değil ... Programı başarısız girişlerde yeniden çalıştırabilir ve düzgün çalışır.


Yakında buna geri döneceğim, ancak şu anda farklı bir model üzerinde çalışmak zorundayım.
blord-castillo

Yanıtlar:


6

İşte kontrol etmeniz gereken bazı şeyler:

İmleçler mi kullanıyorsunuz? Onları serbest bırakıyor musunuz? Farklı işlemlerde herhangi bir nesneyi yeniden kullanmaya mı çalışıyorsunuz? Aynı geçici konumu paylaşıyor musunuz? Bellek işlemede mi çalışıyorsunuz?

Genel olarak, kavis com nesnelerinin etrafında sadece bir sarıcıdır ve her türlü çoklu işlem zor olacaktır.


4

Bu sorun arcpy.env.workspace ve arcpy.env.scratchWorkspace iki farklı işlem için aynı olduğunda ortaya çıktı. Arc, hemen hemen tüm ara rasterleri çalışma alanına (veya çalışma alanını sıfırlayarak) ESRI GRID formatında yazar. Biçimin sözde veritabanı yapısı nedeniyle iki ESRI GRID rasterini aynı dizine aynı anda yazamazsınız (bilgi klasörü her tarama için benzersiz anahtarlar içerir).

Geçici bir tempfile.mkdtemp klasörü kullanarak her işlem için benzersiz çalışma alanı ve scratchWorkspace atayarak bu hatayı önledim.


Zaten benzersiz çalışma alanları kullanıyorum, ancak scratchWorkspace'in de benzersiz olduğunu iki kez kontrol edeceğim. % TEMP% diretory yazdığı için değil tahmin ediyorum.
blord-castillo

Jonah haklı. 5 eşzamanlı iş parçacıkları arasında tek bir dizinde binlerce raster işliyorum; her biri için benzersiz bir çalışma alanı oluşturmak benim için işe yarayan tek çözümdür. Bazılarının önerdiği gibi, benzersiz klasörlere çıktı vermek, daha sonra için daha fazla iş yaratır ... sonunda hepsini aynı dizinde istiyorum.
Tom

Arka tarafta ne acı! Çok işlemli benzersiz çizik çalışma alanını kullanmak çalıştı, ama tanrım, ekstra klasörleri yönetip arktik kilitlerle silmeye çalışmak saçma !!
D_C

3

Ben de bu karşılaştım ve henüz bir ses düzeltme bulmak için. Etrafımda çalışmam 1) görevlerin tamamlanıp tamamlanmadığını kontrol etmek için çok işlemli görevin yeterince sağlam olduğundan emin olmak için yeni bir iş listesi oluşturun. 2) iki komut dosyasını 10-15 dakikada bir başlayacak şekilde zamanlayın. Bir komut dosyası, seçili çalışan python işlemlerini öldürmek için bir komut içerir ve ikinci komut, istenen çok işlemli komut dosyasını yeniden başlatır. Esasen, bu çok işlem havuzunu yeniler. Kill betiği şuna benzer:

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

İstediğiniz komut dosyasının her lansmanı onun bir Csv PID yazmak var.



2

Birden fazla iş parçacığı / çekirdek kaydetme ve bir klasördeki rasters değiştirmeye çalışırken INFADI hatası alıyordum bulundu. Çıktılar için her göreve bir alt klasör atamak sorunu çözüyor gibi görünüyor. Sorunun raster ile ilişkili çevre dosyalarına birden fazla okuma / yazma ile ilgili olması gerektiğine inanıyorum (örn. "Bilgi" klasörü). Şimdi aşağıdaki önlemleri de alıyorum:

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()

Birden çok iş parçacığı üzerinden aynı klasöre birden çok GRID yazma hataları almak gibi görünüyor. Tek sorun, bir seferde sadece bir tarama yazdığı için işlemeyi yavaşlatması ve diş açmayı neredeyse geçersiz kılmasıdır.
Tom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.