मल्टीप्रोसेसिंग त्रुटियां - आर्कगिस कार्यान्वयन


13

मैं सोच रहा था कि क्या यहाँ के समुदाय में किसी और ने स्थानिक विश्लेषण के लिए मल्टी-प्रोसेसिंग का उपयोग करने का प्रयास किया है। पूरी तरह से मैं एक श्रृंखला के माध्यम से चीर-फाड़ करने की कोशिश कर रहा हूं, प्रत्येक के लिए एक मल्टीप्रोसेसिंग जॉब बनाऊंगा और उन्हें एक डीईएफ फ़ंक्शन के भीतर कई जियोप्रोसेसिंग चरणों के माध्यम से चलाऊंगा। की तर्ज पर कुछ

def net(RasterImage, OutFolderDir):
    arcpy.env.overwriteOutput = True  
    arcpy.env.workspace = OutFolderDir 
    DEM_Prj = DEM_Prj.tif

    try:
        arcpy.ProjectRaster_management(RasterImage, DEM_Prj....
        FocalStatistics(DEM_prj....)
        ...

if __name__ == '__main__':  
    InputFolder = r'C:\test\somepath'  
    Output = r'C:\test\somepath2'  
    arcpy.env.workspace = InputFolder  
    arcpy.env.scratchWorkspace = r'C:\test.gdb'    

    fcs = arcpy.ListRasters('*')
    pool = multiprocessing.Pool(4)   
    jobs = []                 
    for fc in fcs:
        rIn = os.path.join(InputFolder,fc)
        rOut = os.path.join(Output,fc[:-4])
        jobs.append(pool.apply_async(net,(rIn, rOut)))    

अब मल्टीप्रोसेसिंग चलता है, आमतौर पर पहले बैच के लिए! हालाँकि, मैं कई डेटासेट्स (4 से अधिक फाइलें - यानी 4 कोर मल्टीप्रोसेसिंग) का प्रयास करते समय कई अलग-अलग त्रुटियों में भागता रहता हूं:

ERROR 010302: Unable to create the output raster: C:\somepath\sr6f8~1\FocalSt_srtm1
ERROR 010067: Error in executing grid expression.
Failed to execute (FocalStatistics).

तथा

ERROR 999999: Error executing function.
Failed to copy raster dataset
Failed to execute (ProjectRaster)

पहली त्रुटि में जो अजीब फ़ोल्डर बनाया गया है (आउटफॉल्डरडिअर लोकेशन में) फोकल आंकड़ों से जुड़ा हुआ है जो लगभग अंतिम आउटपुट की सटीक प्रतिकृति बनाता है।

मेरा प्रश्न यह है कि आपके अनुभव के आधार पर एक मल्टीप्रोसेसिंग फ़ंक्शन के भीतर कई चरण वाले जियोप्रोसेसिंग बनाना असंभव है? या क्या मुझे इन चरणों को उनके व्यक्तिगत जियोप्रोसेसिंग चरणों में टाइल करने की आवश्यकता है?

अपडेट करें

अभी भी इसी तरह की त्रुटियों को एनकाउंटर करते हुए - आयात फ़ंक्शन को डीफ़ल फ़ंक्शन में ले जाने से पता चलता है कि

import arcpy 
from arcpy.sa import *

एक जोड़ा वाक्यविन्यास चेतावनी के साथ एक आउटपुट नहीं बना सकता है जो आयात * की अनुमति नहीं है।

अद्यतन # 2

मुझे पता है कि यह एक देर से जवाब है, लेकिन मुझे लगा कि यह मेरे वर्कअराउंड के भविष्य के संदर्भ के लिए किसी और को फायदा पहुंचा सकता है जो कि आर्कपॉरी के लिए मल्टीप्रोसेसिंग को काम करने की अनुमति देता है। इस समस्या पर लौटने के बाद मुझे जो मुख्य समस्या मिली, वह चापलूसी मॉड्यूल की प्रतियोगिता नहीं है, बल्कि स्क्रैचवर्क क्षेत्र पर प्रतिस्पर्धा है जो आर्कओब्जेक्ट्स अस्थायी फ़ाइलों को बचाने के लिए उपयोग करते हैं। इसलिए प्रत्येक प्रक्रिया के लिए एक अद्वितीय स्क्रैचवर्क बनाने के लिए मल्टीप्रोसेसिंग पार्सिंग तर्क में एक काउंटर चलाने पर विचार करें

Counter = 0 
for fc in fcs:              
    rIn = os.path.join(InputFolder,fc)              
    rOut = os.path.join(Output,fc[:-4])                    
    jobs.append(pool.apply_async(net,(rIn, rOut,Counter)))            
    Counter += 1

फिर मुख्य कार्य में एक विशिष्ट अस्थायी निर्देशिका बनाते हैं और प्रत्येक मल्टीप्रोसेसिंग कार्य के लिए एक अद्वितीय स्क्रैचवर्क क्षेत्र असाइन करते हैं।

def main(RasterImage,OutFolderDir,Counter)      
    TempFolder = os.path.join(os.path.dirname(OutFolderDir),'Temp_%s'%  (Counter))      
    os.mkdir(TempFolder)      
    arcpy.scratchWorkspace = TempFolder      
    ... 

आशा है कि अलग-अलग अस्थायी कार्यक्षेत्रों के उपयोग के लिए रागी के सुझाव के लिए रागी की मदद और धन्यवाद - अभी भी इस बात से चकित है कि यह मूल रूप से काम क्यों नहीं करता है।

अतिरिक्त संसाधन

ईएसआरआई मल्टीप्रोसेसिंग ब्लॉग

अजगर, जीआईएस और स्टफ ब्लॉग


यह सुझाव इतना कच्चा है कि मैं इसे एक उत्तर में औपचारिक रूप नहीं देना चाहता, लेकिन क्या आपने एक साथ कई आभासी मशीनों में आर्कजीआईएस चलाने पर विचार किया है? (आपको प्रत्येक वीएम में एक अलग इंस्टॉलेशन की आवश्यकता हो सकती है, प्रत्येक की अपनी निर्देशिका संरचना के साथ।) एक और कट्टरपंथी विचार है कि कुछ प्रसंस्करण को बाहर करना है: उदाहरण के लिए, फोकलस्टैट्स में किया जा सकता है R। ये सामान्य-प्रयोजन के काम के लिए अच्छे सुझाव नहीं हैं, क्योंकि वे इसके लायक होने की तुलना में अधिक परेशानी हो सकते हैं, लेकिन जब आप एक बार में घंटों की बचत कर सकते हैं, तो बार-बार प्रयास बंद हो सकता है।
whuber

जवाबों:


7

प्रत्येक IWorkspace कनेक्शन (यानी प्रत्येक डेटाबेस कनेक्शन) में थ्रेड एफिनिटी है। दो धागे एक ही कार्यक्षेत्र को साझा नहीं कर सकते हैं। आपके पास संसाधन का एक धागा हो सकता है और फिर पहुंच को सिंक कर सकता है, लेकिन अगर आप सीधे gp फ़ंक्शन का उपयोग करने जा रहे हैं, तो वह भी एक विकल्प नहीं है।

सबसे आसान (लंगड़ा) तरीका अलग-अलग प्रक्रियाएँ बनाना और फिर मल्टी प्रोसेस सिंक्रोनाइज़ेशन (जैसा कि मल्टीथ्रेड सिंक्रोनाइज़ेशन के विपरीत) करना है। फिर भी आपको अंतर्निहित कार्यक्षेत्र प्रकार के बारे में पता होना चाहिए। यदि आप आर्क्सड (एक बहु-उपयोगकर्ता डेटा स्रोत) का उपयोग नहीं कर रहे हैं, तो आप संभवतः एकल उपयोगकर्ता डेटा स्रोत (जैसे व्यक्तिगत या फ़ाइलगार्डब) का उपयोग करेंगे। फिर याद रखें कि एक समय में केवल एक ही प्रक्रिया लिख ​​सकते हैं! इन परिदृश्यों के लिए विशिष्ट (लंगड़ा) सिंक्रनाइज़ेशन यह है कि प्रत्येक समानांतर प्रक्रिया एक अलग अस्थायी कार्यक्षेत्र को लिखती है और फिर आप सभी को एक ही प्रक्रिया में अपने गंतव्य कार्यक्षेत्र में विलय कर देते हैं।


अच्छे सुझाव ... वास्तव में, हालांकि मैंने इसे इस पोस्ट में नहीं जोड़ा है, मैं रास्टर इमेज नाम के आधार पर एक नया फ़ोल्डर बना रहा हूं और प्रत्येक प्रक्रिया के लिए उस विशिष्ट निर्देशिका के लिए कार्यक्षेत्र सेट कर रहा हूं। ये प्रत्येक रैस्टर इमेज के लिए अलग-अलग फाइल डायरेक्टरीज़ हैं और जियोपैट डेटाबेस को अलग नहीं करते (क्या मुझे इसकी आवश्यकता है?)। मैंने तब उन सभी फाइलों को खोजने के लिए एक साधारण os.walk फ़ंक्शन का उपयोग करने की योजना बनाई थी, जिन्हें मुझे अपनी वांछित फ़ाइल जियोडेटाबेस पर ले जाने की आवश्यकता थी।
BJEBN

क्या आप केवल रैस्टर ऑपरेशन कर रहे हैं? क्या एक ही समय में एक ही जियोडेटाबेस पर पढ़ने / लिखने के लिए कोई सूत्र या प्रक्रियाएं हैं?
रागी यासर बुरहुम

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

कुछ हद तक पुनर्विचार करने के बाद मैंने एक विशिष्ट स्क्रैच कार्यक्षेत्र के साथ-साथ प्रत्येक छवि के लिए निर्दिष्ट करने का प्रयास किया। DEM को सही ढंग से अनुमानित किया जा रहा है लेकिन इससे फोकलस्टैट्स चरण में एक नई त्रुटि उत्पन्न हुई है - "टाइप <रैस्टर> समर्थित नहीं है"। मैंने पूरी निर्देशिका पता निर्दिष्ट करने की कोशिश की है, लेकिन कोई भाग्य नहीं है। मैंने बिना किसी समस्या के आर्कगिस में अनुमानित चीरों को लोड किया है।
BJEBN

ठीक है, इसका मतलब है कि आप आगे बढ़ रहे हैं। फोकलस्टेट्स के लिए, यह निर्भर करता है कि इसे आंतरिक रूप से कैसे लागू किया जाता है। यदि यह एक नया कार्यान्वयन है, तो यह एक स्क्रैचवर्क क्षेत्र (यानी जियोडैटेबेस) ले सकता है। हालाँकि, यदि यह उन कार्यों में से एक है, जिन्हें अभी तक अपग्रेड नहीं किया गया है (!?!) तो वह कार्यक्षेत्र जो इसे अनुमति देता है वह केवल एक फ़ोल्डर हो सकता है। उस विशेष जीपी फ़ंक्शन के लिए, केवल एक फ़ोल्डर निर्दिष्ट करें (बाकी के लिए स्क्रैचवर्क क्षेत्र रखें) और देखें कि क्या होता है।
रागी यासर बुरहुम

5

आपके पास एक ही संसाधन के लिए कई लड़ियाँ हैं।

मल्टीप्रोसेसिंग के लक्ष्य में अपने 'इम्पोर्ट आर्कपी' स्टेटमेंट को स्थानांतरित करने का प्रयास करें। आप यह सुनिश्चित करेंगे कि यह पर्यावरणीय चर और स्मृति के सेट के साथ काम कर रहा है।

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

Arcpy धागा सुरक्षित नहीं है। यह हमेशा एक ही प्रक्रिया के भीतर इस्तेमाल करने का इरादा था। लेकिन वर्कअराउंड हैं।


मेरा सुझाव नई प्रक्रिया के लिए लक्ष्य के भीतर आर्कपी को आयात करना था।

def _multiprocessing_target(args):
    import arcpy
    ...code

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