python.multiprocessing और "FATAL ERROR (INFADI) मिसिंग डायरेक्टरी"


9

चापलूसी के साथ मल्टीप्रोसेसिंग करने की कोशिश करते हुए, मैं कभी-कभी इस त्रुटि में भाग रहा हूं:

FATAL ERROR (INFADI)
MISSING DIRECTORY

मेरे पास कोई त्रुटि नहीं है जो इस त्रुटि को ट्रिगर कर रहा है, और यह अजगर प्रक्रिया को क्रैश कर देता है, जिससे इस पर ट्रेसबैक प्राप्त करना असंभव हो जाता है। यह लंबे ध्वनि मॉडल से अंतिम रेखापुंज आउटपुट लिखते समय होता है।

यह कभी-कभी एक त्रुटि के साथ होता है

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

जहाँ% Temp को correclty पार्स किया गया है और #### कुछ यादृच्छिक 4 अंकों की संख्या है। यह असामान्य है क्योंकि प्रत्येक प्रक्रिया का अपना कार्यक्षेत्र है, जो कि जहां अधिकांश फाइलें लिखी जानी चाहिए।

समस्या इनपुट डेटा नहीं है ... मैं प्रोग्राम को विफल इनपुट पर फिर से चला सकता हूं और यह सही ढंग से चलेगा।


मुझे जल्द ही यह वापस मिल जाएगा, लेकिन अभी एक अलग मॉडल पर काम करना है।
ब्लॉर्ड-कास्टिलो

जवाबों:


6

यहाँ कुछ चीजें हैं:

क्या आप कर्सर का उपयोग कर रहे हैं? क्या आप उन्हें रिहा कर रहे हैं? क्या आप किसी भी ऑब्जेक्ट को विभिन्न प्रक्रियाओं में फिर से उपयोग करने की कोशिश कर रहे हैं? क्या आप वही अस्थायी स्थान साझा कर रहे हैं? क्या आप स्मृति प्रसंस्करण में कर रहे हैं?

सामान्य तौर पर, आर्कपी कॉम वस्तुओं के चारों ओर एक आवरण है और किसी भी प्रकार की मल्टीप्रोसेसिंग मुश्किल हो जाएगी।


4

मैंने पाया कि यह समस्या तब उत्पन्न होती है जब arcpy.env.workspace और arcpy.env.scratchWorkspace दो अलग-अलग प्रक्रियाओं के लिए समान होते हैं। आर्क ESRI GRID प्रारूप में कार्यक्षेत्र (या स्क्रैच वर्कस्पेस) पर लगभग सभी मध्यवर्ती रिस्ते लिखता है। प्रारूप के छद्म डेटाबेस संरचना के कारण एक ही समय में एक ही निर्देशिका में आप दो ईएसआरआई जीआरआईडी रेखापुंज नहीं लिख सकते हैं (प्रत्येक फोल्डर के लिए जानकारी फ़ोल्डर अद्वितीय कुंजी रखता है)।

मैंने अस्थायी tempfile.mkdememp फ़ोल्डर का उपयोग करके प्रत्येक प्रक्रिया के लिए अनन्य कार्यक्षेत्र और स्क्रैचवर्क को असाइन करके इस त्रुटि से बचा है।


मैं पहले से ही अद्वितीय कार्यस्थानों का उपयोग करता हूं, लेकिन मैं इस बात को दोहरा दूंगा कि स्क्रैचवर्क भी अद्वितीय है। मैं अनुमान लगा रहा हूं कि यह% TEMP% diretory को नहीं लिख रहा है।
ब्लॉर्ड-कास्टिलो

योना सही है। मैं एक साथ 5 धागों के बीच एक ही निर्देशिका में हजारों चीरों का प्रसंस्करण कर रहा हूं; हर एक के लिए एक अनोखा स्क्रैच वर्कस्पेस सेट करना एकमात्र उपाय है जो मेरे लिए काम करता है। अद्वितीय फ़ोल्डरों के लिए आउटपुट, जैसा कि कुछ ने सिफारिश की है, बस बाद के लिए और अधिक काम बनाता है ... आखिरकार मैं उन सभी को एक ही निर्देशिका में चाहता हूं।
टॉम

पीठ में क्या दर्द! मल्टीप्रोसेसिंग के साथ अनूठे स्क्रैच वर्कस्पेस का उपयोग करना, लेकिन मेरे भगवान, अतिरिक्त फ़ोल्डरों को प्रबंधित करना और फिर उन्हें आर्करी ताले से हटाने की कोशिश करना हास्यास्पद है !!
D_C

3

मैं यह भी सामना किया है और अभी तक एक ध्वनि तय करने के लिए है। यह सुनिश्चित करने के लिए मेरा काम 1 है) कि कार्य पूरा हो गया है या नहीं, तो एक नई नौकरी सूची बनाएं, यह जांचने के लिए कि बहुप्रक्रिया कार्य काफी मजबूत है। 2) हर 10-15 मिनट में लॉन्च करने के लिए दो स्क्रिप्ट शेड्यूल करें। एक स्क्रिप्ट में चुनिंदा चल रहे अजगर प्रक्रियाओं को मारने के लिए एक कमांड होता है और दूसरा वांछित मल्टीप्रोसेसिंग स्क्रिप्ट को पुनः लोड करता है। अनिवार्य रूप से, यह मल्टीप्रोसेसिंग पूल को ताज़ा करता है। किल स्क्रिप्ट कुछ इस तरह है:

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

वांछित स्क्रिप्ट के प्रत्येक लॉन्च मैंने इसे अपने PID को एक csv पर लिखा है।


3

मुझे स्वीकार करना चाहिए कि मैं इस बिंदु पर हूं, सिर्फ एक मल्टीथ्रेडिंग वनाबी, लेकिन https://pythongisandstuff.wordpress.com/2013/07/31/use/arcpy-with-multiprocessing-%E2%80%93-part पर एक ब्लॉग -3 / पता चलता है कि arcpy.Exists()फ़ंक्शन को एकीकृत करना इसे बनाने के लिए महत्वपूर्ण है।


2

मैंने पाया कि जब मैं एक फ़ोल्डर में कई थ्रेड / कोर को बचाने और संशोधित करने की कोशिश कर रहा था तो मुझे INFADI त्रुटि मिल रही थी। आउटपुट के लिए प्रत्येक कार्य के लिए एक सबफ़ोल्डर असाइन करना समस्या को हल करने के लिए लगता है। मेरा मानना ​​है कि समस्या को रिस्टर से जुड़ी परिधीय फाइलों (जैसे "जानकारी" फ़ोल्डर) को कई बार पढ़ना / लिखना पड़ता है। अब मैं निम्नलिखित सावधानियां भी लगाता हूं:

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

मुझे लगता है कि एकाधिक थ्रेड्स के माध्यम से एक ही फ़ोल्डर में कई GRID लिखने से त्रुटियां नहीं आती हैं। एकमात्र समस्या यह प्रतीत होती है कि ऐसा करने से प्रसंस्करण धीमा हो जाता है और वस्तुतः थ्रेडिंग को अमान्य कर देता है, क्योंकि यह केवल एक बार में एक रेखापुंज लिखता है।
टॉम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.