आर्कियन टूल्स के रूप में चल रहे अजगर लिपियों को गति देने के तरीके [बंद]


31

यह एक सामान्य प्रश्न है। मैं बस सोचता हूं कि जीआईएस प्रोग्रामर ने कौन से टिप्स और ट्रिक्स का इस्तेमाल किया है, जो कि आप आर्काइव स्क्रिप्ट्स को इम्पोर्ट करते हैं, जिसे आप टूलबॉक्स में इम्पोर्ट करते हैं और चलाते हैं।

मैं अपने कार्यालय की प्रक्रिया जीआईएस डेटा में गैर-जीआईएस उपयोगकर्ताओं की मदद करने के लिए रोजाना सबसे छोटी स्क्रिप्ट लिखने का काम करता हूं। मैंने पाया है कि आर्कजीआईएस 10.0 प्रसंस्करण सामान्य रूप से 9.3.1 से धीमा है और कभी-कभी यह एक पायथन स्क्रिप्ट को चलाने पर भी धीमा हो जाता है।

मैं एक स्क्रिप्ट का एक विशेष उदाहरण सूचीबद्ध करने जा रहा हूं जिसे चलाने में 24 घंटे लगते हैं। यह एक लूप है जो बफर में प्रत्येक आकृति के लिए एक बफर में एक रेखापुंज के क्षेत्र को सारणीबद्ध करता है। बफर में लगभग 7000 आकृतियाँ हैं। मुझे विश्वास नहीं है कि इसे लंबे समय तक चलना चाहिए। ए

while x <= layerRecords:

    arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
    arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x))                                  # Selecting the record
    TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc)                          # Tabulate the area of the single row

    arcpy.AddMessage ("          - Row: " + str(x) + " completed")
    x = x + 1
    z = z + 1

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

वैसे भी, अगर किसी को इस स्क्रिप्ट का अनुकूलन या गति बढ़ाने के बारे में कोई विचार है, तो यह सबसे अधिक सराहनीय होगा। अन्यथा, जब आप ArcGIS में उपयोग किए जाते हैं, तो आपके पास अजगर के लिए कोई गति है?

जवाबों:


26

आपकी प्रक्रिया को गति देने में मदद करने के लिए कुछ संभावित सुझाव हैं:

  1. आर्किस डेस्कटॉप को लॉन्च किए बिना, लेयर बाय अट्रैक्शन पायथन-ओनली स्क्रिप्ट में हो सकता है। आपको अपने "बफ़" संदर्भ को फ़ाइल-आधारित संदर्भ से "आर्कजीआईएस लेयर" संदर्भ में बदलने की आवश्यकता है, जिसके खिलाफ आर्कजीआईएस चयन प्रश्नों को संसाधित कर सकता है। "लूप" का उपयोग करते समय अपने "ऊपर" के ऊपर arcpy.MakeFeatureLayer_management (" बफ़र ", "बफ_लियर") का उपयोग करें , और फिर "बफ़र" का उपयोग करने के लिए लूप के नीचे अपने संदर्भ बदलें।

  2. संभव के रूप में in_memory कार्यक्षेत्र का उपयोग करके अपने बहुत सारे GP संचालन की प्रक्रिया करें ... अपने स्रोत को स्मृति में ले जाने के लिए arcpy.CopyFeatures_management (आकार-रेखा, "in_memory \ memFeatureClass") का उपयोग करें। यह केवल तभी अच्छी तरह से काम करता है जब आपके पास सभी फीचर क्लास (तों) को पढ़ने के लिए पर्याप्त रैम हो जो आपको मेमोरी में चाहिए। हालाँकि, सावधान रहें कि कुछ GP ऑपरेशन हैं जो in_memory वर्कस्पेस (जैसे: प्रोजेक्ट टूल) का उपयोग करके नहीं चल सकते हैं।

ArcGIS 9.3 से ऑनलाइन मदद लेख " मध्यवर्ती डेटा और खरोंच कार्यक्षेत्र " (ध्यान दें, इस भाषा को 10.0 और 10.1 से हटा दिया गया था):

नोट: केवल टेबल और सुविधा वर्ग (अंक, रेखाएँ, बहुभुज) को the_memory कार्यक्षेत्र में लिखा जा सकता है। In_memory कार्यक्षेत्र उप-जंतु, डोमेन, अभ्यावेदन, टोपोलॉजी, जियोमेट्रिक नेटवर्क और नेटवर्क डेटासेट जैसे विस्तारित जियोडेटाबेस तत्वों का समर्थन नहीं करता है। केवल सरल सुविधाओं और तालिकाओं को लिखा जा सकता है।

ArcGIS 10.1 से ऑनलाइन मदद लेख " इन-मेमोरी वर्कस्पेस का उपयोग करना ":

इन-मेमोरी वर्कस्पेस में आउटपुट लिखने का निर्णय लेने के लिए निम्नलिखित विचार किए जाने चाहिए:

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

1
यह बढ़िया है! मैं ArcMap के बाहर चयन का उपयोग करने के लिए एक रास्ता तलाश रहा हूं लेकिन, अब तक असफल रहा था। इस समस्या के संदर्भ में, इसने वास्तव में मेरे समय को प्रति पंक्ति 20 सेकंड से लगभग 13 सेकंड तक नीचे धकेल दिया। लेकिन, मैंने एक त्वरित अन्य काम किया और लूप के भीतर MakeFeatureLayer किया और यह 9 सेकंड तक नीचे चला गया। मैंने फीचर लेयर से सारणीबद्ध करने की अपेक्षा प्रत्येक आकृति से एक फीचर बनाकर ऐसा किया। यदि संभव हो तो मैं इसे और नीचे लाना चाहूंगा, लेकिन पहले से ही यह बहुत तेज़ प्रक्रिया है!
कोडी ब्राउन

जैसा कि # 2 में बताया गया है, अपने स्रोत डेटा की प्रति in_memory की प्रतिलिपि बनाने के लिए CopyFeatures का उपयोग करें, फिर in_memory स्रोत के विरुद्ध अपना फ़ीचर_लेयर बनाएं। हालाँकि, स्मृति की प्रारंभिक प्रतिलिपि कुछ सेकंड के ऊपर-सामने जोड़ सकती है, आप यह पा सकते हैं कि copyfeatures + tabulate_areas के प्रसंस्करण में आपके वर्तमान मॉडल की तुलना में तेज़ प्रसंस्करण समय है।
रयानडाल्टन

मैंने कोशिश की है कि के रूप में अच्छी तरह से और ऐसा लगता है कि समाधान लूप की प्रक्रिया को तेज करेगा लेकिन, ऐसा नहीं है। लूप में फ़ीचर लेयर बनाने का परिणाम लूप के लगभग 8-10 सेकंड का होता है, जबकि लूप के 11 से 14 सेकंड प्रति लूप में फ़ीचर लेयर बनाने से पहले। मुझे भी यकीन नहीं है कि चूंकि आपका समाधान ऐसा लगता है कि यह तेजी से प्रक्रिया करेगा। मेरे पास 8GB रैम है, इसलिए मुझे संदेह है कि समस्या होगी।
कोड़ी ब्राउन

इसके अलावा लूप से पहले in_memory पर फीचर्स को कॉपी करना और फिर लूप में फीचर लेयर बनाना थोड़ा तेज परफॉर्मेंस देता है। यह बहुत अधिक प्रत्येक लूप के लिए प्रति पंक्ति 8 सेकंड रहता है। जो कुल प्रक्रिया समय को 26 घंटे से 22 तक गिरा देगा।
कोड़ी ब्राउन

अपने विचारों को जोड़ने के बाद मेरी स्क्रिप्ट में नाटकीय रूप से सुधार हुआ। तुम्हारा और सबकी मदद के लिए एक टन धन्यवाद!
कॉडी ब्राउन

28

सामान्य अजगर अनुकूलन तकनीक आपको पर्याप्त मात्रा में समय बचा सकती है।

जहां आपकी स्क्रिप्ट में होल्ड अप्स हैं, उसका लोअरडाउन करने के लिए वास्तव में अच्छी तकनीक बिल्ट-इन cProfile मॉड्यूल का उपयोग कर रही है:

from cProfile import run
run("code") # replace code with your code or function

एक छोटे डेटा नमूने का उपयोग करके परीक्षण आपको यह इंगित करने की अनुमति देगा कि कौन से फ़ंक्शन कॉल में सबसे अधिक समय लग रहा है।

तेजी से अजगर कोड के लिए सामान्य संकेत:

  • सूची की समझ आम तौर पर लूपिंग से तेज होती है
  • जनरेटर एक बार में पूरी सूची तैयार करने के बजाय समय पर एक आइटम का उत्पादन करते हैं
  • अजगर 2 में श्रेणी के बजाय xrange का उपयोग करें (3 में आवश्यक नहीं)
  • सेट पहिले सूचियों बाहर कर सकते हैं जब यह करने के लिए कि एक आइटम सेट में मौजूद है की बात आती है लेकिन आम तौर पर धीमी सूचियों से हैं, जब यह उनकी सामग्री से अधिक पुनरावृत्ति की बात आती है स्रोत
  • समारोह कॉल कर सकते हैं प्रदर्शन करने के लिए महंगा हो स्रोत
  • अधिक युक्तियां और विवरण यहां पायथन परफॉमेंस टिप्स और यहां 10 पायथन ऑप्टिमाइजेशन टिप्स और मुद्दे की जांच करते हैं

आपकी स्क्रिप्ट के संबंध में, मैं आर्कपी पहलुओं पर टिप्पणी नहीं कर सकता, क्योंकि मेरे पास आर्क इस कंप्यूटर पर स्थापित नहीं है, लेकिन आप कुछ समय के लिए लूप के बजाय लूप के उपयोग के लिए कोशिश कर सकते हैं अगर कुछ भी सुधार होता है। इसके अलावा x = x + 1 को x + = 1 के रूप में लिखा जा सकता है:

for record in layerRecords:
arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x))                                  # Selecting the record
TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc)                          # Tabulate the area of the single row

arcpy.AddMessage ("          - Row: " + str(x) + " completed")
x+=1
y+=1

1
मैंने आपके अंतिम बुलेट पर आपके द्वारा छोड़े गए दो लिंक का उपयोग किया और कुछ त्वरित सुधारों के साथ मेरी स्क्रिप्ट को वास्तव में मदद करने में सक्षम था!
कॉडी ब्राउन

अगर मैं दो सही उत्तर दे सकता हूं। जबकि आपके उत्तर ने वास्तव में अजगर को गति देने के बारे में बहुत सारे विचार पेश किए, @RyanDalton ने उस विचार की पेशकश की जिसका सबसे अधिक प्रभाव पड़ा। अनेक अनेक धन्यवाद!
कोड़ी ब्राउन

13

सुनिश्चित करें कि आप कंप्यूटर पर आंतरिक ड्राइव पर लिख रहे हैं। जब आवश्यक नहीं है तो नेटवर्क पर पहुंचना वास्तव में प्रसंस्करण को धीमा कर सकता है। यह भी तेजी से हो सकता है कि डेटा को कॉपी करने की प्रक्रिया में पहले चरण के रूप में बाद के रीड-राइट्स को जितनी जल्दी हो सके रखें

ArcMap के बाहर पूरी तरह से स्क्रिप्ट चलाना बहुत तेज़ हो सकता है। यदि प्रसंस्करण के दौरान मानचित्र की आवश्यकता नहीं है, तो आर्कपैम का उपयोग न करें।


मैंने पाया है कि आर्ककॉस्टिक्स (एक Calculate Valueडायलॉग के अंदर खुद से ) के अंदर एक स्क्रिप्ट चलाने से आर्कपाइप में आर्कपी विंडो से एक ही स्क्रिप्ट चलाने की तुलना में तेजी से प्रक्रिया होगी। हालांकि यह विशुद्ध रूप से एक वास्तविक अवलोकन है।
सिंडी जयकुमार

1
मेरा मानना ​​है कि मुझे ठीक से काम करने के लिए टैबुलेट के लिए एक मानचित्र की आवश्यकता है, लेकिन मैं यह कोशिश करने जा रहा हूं। अगर यह आर्कपेक के बाहर काम करता है, तो मुझे यकीन है कि यह गति बढ़ाएगा। इसके अलावा, मैं पहले से ही स्थानीय डिस्क बंद कर रहा हूं, जो पहले से ही स्क्रिप्ट की गति को दोगुना कर देता है।
कोड़ी ब्राउन

अफसोस की बात है कि चयन आर्कपेक के बाहर काम नहीं करता है और यह आवश्यक है क्योंकि मुझे आकार द्वारा सारणीबद्ध आकार करने की आवश्यकता है।
कोडी ब्राउन

3
@ CodyBrown- आप एक आर्केप्स सत्र के बाहर काम नहीं करने के बारे में गलत हैं। MakeFeatureLayer टूल का उपयोग करने के बारे में मेरी प्रतिक्रिया देखें।
रयानडाल्टन

रयान सही है। जब सेलेक्ट टूल का उपयोग किया जाता है तो यह आपके स्थानिक डेटा या टेबल डेटा का एक टेबल व्यू बनाता है। ModelBuilde या किसी स्क्रिप्ट में इसका उपयोग करते समय, आपको एक दृश्य बनाना होगा, और आपके मामले में, इसे MakeFeatureLayer टूल का उपयोग करके क्रिएट करें।
dchaboya

6

यह ArcMap के अंदर ArcPy टूल को चलाने के लिए आपके प्रश्न का उत्तर नहीं दे सकता है, लेकिन जब मुझे जियो-प्रोसेसिंग टूल और पायथन के साथ कुछ भावपूर्ण प्रसंस्करण करने की आवश्यकता होती है, तो मैं इसे IDE PyScripter का उपयोग करके GIS सिस्टम के बाहर चलाने के लिए करता हूं । मैंने पाया है कि यह तेजी से चलता है। मैंने छोटे अस्थायी आउटपुट डेटासेट के लिए RAMDISK भी काम किया है ( in_memory वर्कस्पेस की तरह )

वैसे वे मेरी शीर्ष युक्तियाँ हैं! :)


2
इस उत्तर को कुछ हद तक मैला करने के लिए, जब पायथन आईडीई की स्क्रिप्ट्स चल रही हैं, चर और अन्य विभिन्न डीबगिंग सहायता देखने में सहायता करने के लिए कई ट्रेसबैक फ़ंक्शन को इंजेक्ट करते हैं। यह फ़ंक्शन स्क्रिप्ट को बड़े पैमाने पर धीमा कर सकता है यदि यह बहुत अधिक करता है क्योंकि इसे सभी समय कहा जाता है, और कभी-कभी यह उपयोगकर्ता के हस्तक्षेप के बिना अंतर्निहित रूप से स्थापित होता है। एक विशेष रोग संबंधी मामला था जहां मैंने देखा कि आर्कप में चलने वाली पायथन स्क्रिप्ट 4 मिनट में चलती है, जबकि विंग आईडीई से एक ही स्क्रिप्ट में 3 घंटे लगते हैं। जैसे ही इसे विंग के बिना Python.exe से चलाया गया, यह ~ 2-3 मिनट के रनटाइम क्षेत्र में वापस चला गया।
जेसन शहीर

1
मुझे ArMap पर अपनी स्क्रिप्ट्स को ट्यून करने के लिए सिरदर्द हो रहा था, कभी-कभी मैं पूरी तरह से नहीं कर सकता, जब तक कि मैंने Pyscripter की ओर रुख नहीं किया, यह आर्कमैप की तुलना में निष्पादन समय को स्लैश कर सकता है, बिना किसी अनुकूलन टिप का उपयोग किए।
geogeek

@JasonScheirer क्या आपको विंग में ट्विस्ट मिल गया है? मुझे यकीन है कि एक है।
कर्टिस प्राइस

5

Arcpy.SetProgressorLabel पर टिप्पणी करने का प्रयास करें और देखें कि आप कितना गति बढ़ाते हैं। मैंने पाया है कि किसी भी स्क्रीन आउटपुट, डॉस डेज़ पर वापस जा रहा है, बहुत तेजी से प्रसंस्करण समय धीमा कर देता है। यदि आपको वास्तव में उस आउटपुट को देखने की आवश्यकता है, तो इसे प्रत्येक Nth लूप दिखाने की कोशिश कर रहा है।


4

सुनिश्चित करें कि आप import xxxxउपयोग की जा रही लाइनों को हटा दें ।

(यानी, यदि आपके पास अभी तक कोई गणितीय कार्य नहीं कर रहे हैं import Math, तो यह स्क्रिप्ट लोडिंग से कुछ समय लेगा)

हालाँकि यह एकल स्क्रिप्ट पर बहुत प्रभाव नहीं डालेगा, जो (जैसे कि आपकी) चलती हैं, यह किसी भी स्क्रिप्ट को प्रभावित करेगी जो बार-बार और दोहराव से चलती हैं।


7
मुझे संदेह है कि किसी भी मानक पायथन मॉड्यूल को प्रारंभ करने के लिए आर्कपी मॉड्यूल लेने में एक हजार से अधिक समय लगता है।
ब्लाह 238

1
@ blah238 import Mathशायद एक बुरा उदाहरण था। हालांकि, कुछ बड़े आर्कपी लाइब्रेरी, लोड होने में काफी समय लेते हैं।
नगिटेच

1
यह अभी भी केवल कुछ ही सेकंड में बंद हो जाता है (अधिकतम!), घंटे नहीं
माइक टी

1
@MikeToews अक्सर और दोहराव से चलने वाली लिपियों के लिए, कुछ सेकंड / सप्ताह आदि के दौरान कुछ सेकंड जुड़ जाते हैं, हालांकि यह ओपी के मुख्य मुद्दे को हल नहीं करता है, उन्होंने सामान्य युक्तियों के लिए कहा।
nagytech
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.