पायगॉन स्क्रिप्ट्स (टू .exe) का संकलन करना जो आर्कगिस जियोप्रोसेसिंग टूल का उपयोग करते हैं?


12

मैं अब कई महीनों के लिए पायथन के साथ कोडिंग कर रहा हूं और मुख्य रूप से जियोप्रोसेसिंग कार्यों के लिए कुछ यथोचित जटिल स्क्रिप्ट विकसित की है। कहा जा रहा है, मैं अभी भी बहुत कुछ सीख रहा हूं क्योंकि मैं एक SQL / VBA / VBScript पृष्ठभूमि से आ रहा हूं।

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

क्या यह भी संभव है? यदि यह है, तो एक पायथन (.py) स्क्रिप्ट को संकलित करने का सबसे अच्छा तरीका क्या है जो आर्कगिसस्क्रिप्टिंग या आर्कपी मॉड्यूल का आयात कर रहा है?

मैंने कुछ मिनट लगाने की कोशिश की कि मैं क्या करना चाहता हूं और खोज ने इस लेख को अन्य लोगों के बीच वापस लौटा दिया: http://www.ehow.com/how_2091641_compile-python-code.html

कंपाइलर काम करने लगता था, लेकिन परिणामी .EXE फ़ाइल को निष्पादित करने पर, यह एक गुप्त त्रुटि बता देता है कि कुछ फाइलें अनुपलब्ध थीं।

पायथन स्क्रिप्ट चलती है जो कमांड लाइन से काफी अच्छी तरह से प्रतीत होती है, लेकिन मैं सोच रहा हूं कि क्या मैं कुछ मामूली सुधार देख सकता हूं अगर मैं .py फ़ाइल को संकलित करने में सक्षम था। फिर से, मैं कुछ बड़े डेटासेट्स के साथ काम कर रहा हूं, जिन्हें प्रोसेस करने में +20 घंटे लग रहे हैं (इनपुट वाटर-क्वालिटी सैंपल साइट्स से वाटरशेड्स डिलीट कर रहे हैं)। मैं सुधार के रास्ते में कुछ भी ले सकता हूं।

स्क्रिप्ट साइटों की एक परीक्षण सेट का उपयोग कमांड लाइन से जल्दी ArcGIS के बाहर 10% भाग गया बनाम ArcCatalog में एक नया पिटारे में एक स्क्रिप्ट उपकरण के रूप में स्क्रिप्ट की स्थापना। मैं कमांड लाइन w / o से एक समर्पित मशीन पर आर्कजीआईएस के किसी भी उदाहरण को खोलने के लिए स्क्रिप्ट चला रहा हूं।

तो, क्या पायथन लिपियों को संकलित करना संभव है जो आर्कगिसस्क्रिप्टिंग मॉड्यूल को आयात करते हैं और जो आर्कटूलबॉक्स टूल कहते हैं?

संपादित करें

इनपुट के लिए धन्यवाद, यह मेरे लिए उपयोगी है। स्क्रिप्ट काफी हद तक आर्कगिस उपकरणों की एक संख्या को समन्वित करने और वांछित स्वरूपों / स्थानों / उपयुक्त एट्रिब्यूशन के साथ आउटपुट करने का एक तरीका है। मैंने पहले से ही कुछ वसा की छंटनी की है जो मुझे लगता है कि कुछ अंतरिम रेखापुंज फ़ाइलों के लिए एक स्क्रैच पर्सनल जियोडैटेबेस के बजाय एक स्क्रैच फ़ोल्डर में लिख दिया जाता है ताकि उन्हें ईएसआरआई जीआरआईडी प्रारूप बनाम आईएमजी प्रारूप में संग्रहीत किया जा सके। मैं हालांकि profiler सुझावों की जाँच करेंगे।

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

EDIT - रेखापुंज स्वरूपों के साथ कार्यक्रम के अनुकूलन पर अद्यतन।

इस पायथन कार्यक्रम के मेरे "अनुकूलन" का पालन करना चाहते थे, और मैं एक व्यक्तिगत जियोडेटाबेस के बजाय जीआरआईडी प्रारूप में अंतरिम आपदाओं को लिखकर 2 घंटे की प्रसंस्करण समय दाढ़ी बनाने में सक्षम था। इतना ही नहीं, डेटा साइज़ डिस्क स्थान की खपत में एक SIGNIFICANT कमी थी। मूल रन मैंने सभी रैस्टर्स को लिखा था (और वे केवल पॉइंट फीचर्स थे जो रैस्टर्स में बदल गए थे, और फिर वाटरशेड रैस्टर्स) 37.1 जीबी डेटा सिर्फ उन फाइलों के लिए थे। जीआरआईडी प्रारूप में एक फ़ोल्डर में बाद के दो डेटा आउटपुट लिखना 667 एमबी डेटा तक कम हो गया था।

मैं यह देखने के लिए उत्सुक हूं कि एक फ़ाइल GDB इन डेटा को कैसे संभालती है, हालांकि मुख्य रूप से डेटा के आकार के रूप में। लेकिन, मेरे प्रसंस्करण समय को 9.5 घंटे से घटाकर 7.5 घंटे करना निश्चित रूप से जीआरआईडी प्रारूप में जियोडैट डेटाबेस के बाहर की आपदाओं से निपटने के लिए पर्याप्त है।


यह मॉर्निंग आर्कगिस सर्वर ब्लॉग बहुत समय पर है। स्टर्लिंग @ esri क्यों और कब [यहाँ।] [1] [1]: blogs.esri.com/Dev/blogs/arcgisserver/archive/2011/04/12/…
ब्रैड नॉमॉम

जवाबों:


15

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

py2exe वास्तव में आपके कोड को मूल x86 / x64 में संकलित नहीं करता है, यह सिर्फ एक निष्पादन योग्य प्रदान करता है जो आपकी स्क्रिप्ट को बायटेकोड के रूप में एम्बेड करता है और इसे अपने सिस्टम पर पायथन के बिना उपयोगकर्ताओं को वितरित करने का एक सबसे पोर्टेबल तरीका प्रदान करता है। आर्कगिसस्क्रिप्टिंग को बंडल करने का प्रयास करते समय यह विफल हो गया, यही वजह है कि यह काम नहीं किया। वास्तव में py2exe काम करना अभी भी कुछ भी प्रदर्शन-वार नहीं करेगा।

मैं बहुत दृढ़ता से आपको पहले सुझाता हूं कि धीमी बिट्स की पहचान करने के लिए एक प्रोफाइलर का उपयोग करें और वहां से ऑप्टिमाइज़ करें। पायथन में बनाया गया एक बहुत अच्छा सेट है , इसे तेजी से बनाने के लिए संभावित स्थानों को खोजने के लिए लंबे समय पर cProfile का उपयोग करें । वहाँ से आप कस्टम C में वर्गों को अनुकूलित कर सकते हैं या संभवतः छोटे भागों के साथ Cython .pyx मॉड्यूल के रूप में प्रयोग कर सकते हैं ।

संभवतः आप पायथन को मूल कोड एक्सटेंशन मॉड्यूल के रूप में पूरे पायथन स्क्रिप्ट के निर्माण के लिए देख सकते हैं, लेकिन साइको आपको प्रवेश के लिए एक कम बाधा के साथ एक प्रदर्शन को बढ़ावा भी दे सकता है।


4

स्क्रिप्ट संस्करण की तुलना में आर्कटूलबॉक्स में मानक टूल से चलाने पर वाटरशेड का परिसीमन कितना समय लगता है? यदि समय समान है, तो मुझे संदेह है कि कोई सुधार नहीं होगा। आप ArcMap के बाहर की पृष्ठभूमि में लंबी प्रक्रियाओं को चलाने पर विचार करना चाह सकते हैं।


मैंने अपने मूल प्रश्न को स्पष्ट कर दिया है, और मैं अभी भी एक सकारात्मक हाँ प्राप्त करने की उम्मीद कर रहा हूं / इस तरह के कोड को संकलित करना संभव नहीं है क्योंकि यह उत्तर मेरे प्रश्न का उत्तर नहीं देता है।
१२'११ को राजगद्दी

2
@ तुकी यह सीधे आपके सवाल का जवाब नहीं दे सकता है लेकिन यह एक उत्कृष्ट सुझाव है। संभावना है कि आपकी प्रक्रिया परिसीमन में अपना सारा समय व्यतीत कर रही है, इसलिए कोड को ट्विक करने की कोई भी राशि प्रशंसनीय रूप से मदद नहीं करेगी। हालाँकि, एल्गोरिथ्म पर पुनर्विचार करने से बहुत अंतर आ सकता है। तो पहली चीजों में से एक जो आप करना चाहते हैं वह है वर्तमान निष्पादन को देखने के लिए कि क्या आप इस संकलन दृष्टिकोण के साथ अपना समय बर्बाद कर रहे हैं।
whuber

1
मैं @Dan और @whuber से सहमत हूं। मुझे लगता है कि एक गहन विश्लेषण (यानी बेंचमार्किंग और प्रोफाइलिंग) करने से प्रदर्शन में सुधार के लिए बेहतर समझ मिलेगी, बस एक जानवर-बल सब कुछ संकलित कर सकता है।
जेसन शहीर 23

4

अच्छे कारण के बिना एक व्यक्तिगत geodatabase का उपयोग न करें। हमारे अनुभव में वे एस्री डेटा भंडारण ( रेफरी ) के अन्य सभी रूपों की तुलना में लगातार धीमी हैं । हालाँकि मैंने यहाँ GIS.se पर एक रिपोर्ट पढ़ी है जो फ़ाइल gdb की तुलना में अधिक व्यक्तिगत दिखाई देती है।

जब वर्कफ़्लो में कई छोटे पुनरावृत्तियों होते हैं, तो जियोप्रोसेसर बनाने और एक लाइसेंस की जांच करने के लिए कॉल अक्सर अजगर का उपयोग करने का सबसे महंगा हिस्सा होता है। इसलिए जितना आप या तो सामने या पीछे gp = ...(या import arcpyv10 में) कर रहे हैं, वह एक तकनीक है जिसका मैं बहुत उपयोग करता हूं।

संकलन के संबंध में, यह उद्धरण इसे सर्वश्रेष्ठ कहता है:

यह ध्यान देने योग्य है कि संकलित [अजगर] स्क्रिप्ट को चलाते समय एक तेज स्टार्टअप समय होता है (क्योंकि इसे संकलित करने की आवश्यकता नहीं है), यह किसी भी तेजी से नहीं चलता है

मार्क सीडरहोम के पास पिकोथॉन में आर्कोबजेक्ट्स का उपयोग करने के बारे में एक प्रस्तुति है जिसमें शेपेकॉपी ऑपरेशन (# 4 स्लाइड) पर कुछ आंकड़े हैं। पायथन बहुत अच्छी तरह से उचित नहीं है, जो 32% C ++ (VBA 92%, VB & C # 48% पर) के साथ प्राप्त किया जा सकता है। बहुत तेज़ी से भागते और चिल्लाते मत जाओ, बहुत से जियोप्रोसेसिंग उपकरण वैसे भी पाइथन स्क्रिप्ट हैं (खोज c: \ program files \ arcgis \ '' * .py ') के लिए।

जैसा कि कई अन्य स्थानों में कहा गया है, अजगर ने C या C ++ कोर फ़ंक्शन को संकलित या लिखकर प्रदर्शन को अनुकूलित करने की कोशिश करने में बिताया समय अक्सर रनटाइम पर किए गए किसी भी वास्तविक प्रदर्शन लाभ (संभवतः) को बौना कर देता है। कई लोग कहते हैं कि पायथन का मुख्य लाभ डेवलपर के समय का अनुकूलन और सुधार है ; मशीन प्रसंस्करण समय की तुलना में मानव का ध्यान बहुत अधिक मूल्यवान और महंगा है।


1
सभी मामलों पर हां। मेरे पैसे के लिए, डेवलपर समय का इष्टतम उपयोग पाइथन, बेंचमार्क में प्रोटोटाइप * के लिए है, अड़चनों को अनुकूलित करने के लिए C / C ++ तक छोड़ें। * मैं कहता हूं कि प्रोटोटाइप, लेकिन मैं 95% समय जानता हूं कि 'प्रोटोटाइप' इसे उत्पादन में लाने जा रहा है।
जेसन शहीर

पायथन में ArcObjects पर लिंक के लिए शानदार टिप्पणियां और धन्यवाद। मुझे लगता है कि एक GDB को लिखने से डेटा प्रबंधन परिप्रेक्ष्य बनाम शेपफाइल (आकृति तालिका में विशेषता तालिका प्रतिबंध, फीचर कक्षाएं, ज्यामिति प्रतिनिधित्व, समग्र डेटा प्रबंधन प्रथाओं, आदि) के साथ-साथ उन चीजों से लाभ होता है जो आप बहुत आसान और साफ कर सकते हैं। एक पहुंच वातावरण बनाम डीबीएफ फाइलों से निपटना। तो, मूल रूप से एक लागत-लाभ वाला ट्रेड-ऑफ जो आप कर रहे हैं और आउटपुट डेटा के साथ जो आप करने जा रहे हैं। GDB के बाहर के चींटियों का मध्य मैदान और GDB में बाकी सब कुछ काम करता हुआ प्रतीत होता है।
२६:११

1

आप अजगर कोड को मशीन कोड पर संकलित नहीं कर सकते। जब यह पहली बार चलता है, तो यह एक मध्यवर्ती भाषा 'बाइटेकोड' के लिए संकलित होता है, (जो pyc फाइलें बनाता है)

py2exe इंटरप्रिटर द्वारा आवश्यक dll फ़ाइलों और किसी निष्पादन योग्य किसी आवश्यक अजगर फ़ाइलों / बाहरी फ़ाइलों को लपेटता है। यह संकलित नहीं है - रनटाइम बहुत अलग नहीं होना चाहिए।

विभिन्न तकनीकों के संयोजन का उपयोग करके पायथन कोड को बहुत तेजी से चलाना संभव है।

अड़चनों को खोजने के लिए पहली चीज जो आपको करनी चाहिए वह है अपने कोड को प्रोफाइल करना। एक बार मिल जाने पर, मैं आमतौर पर इस प्रक्रिया का उपयोग करता हूं:

  • सुन्न सरणियों या मानचित्र () फ़ंक्शन का उपयोग करके 'छोरों' के लिए हटा दें। यह मूल रूप से लूप को C में धकेलता है।
  • एल्गोरिथ्म के बेहतर क्रियान्वयन की जांच करें (इस तरह का उपरोक्त के साथ समवर्ती रूप से जाता है)। I / O परिचालनों की संख्या को कम करने की तरह सामग्री, यह सुनिश्चित करना कि डेटा को एक्सेस किया जाता है या सन्निहित ब्लॉकों में संग्रहीत किया जाता है।
  • इंटरप्रेटर 'ट्रिक्स' जैसे कि लूप्स के भीतर महंगे लुक्स से परहेज करना, 'लूप्स के अंदर' ब्लॉक होने से बचना (इसके बजाय 'ट्राय' का इस्तेमाल करें)
  • इसे फिर से प्रोफाइल करें
  • यदि यह अभी भी बहुत धीमा है, तो साइथॉन का उपयोग करके सी में महत्वपूर्ण भागों को धक्का दें (या सीधे सी में लिखकर, एक डीएल बनाएं और इसे कॉल करने के लिए ctypes का उपयोग करें)
  • फिर से प्रोफाइल
  • यदि अभी भी बहुत धीमा है, तो समानांतर या GPU कंप्यूटिंग (मल्टीप्रोसेसिंग लाइब्रेरी, pyCUDA, ParallelPython आदि) देखें

0

यदि आप किसी अन्य स्थान से अजगर स्क्रिप्ट आयात करते हैं तो यह एक .pyc फ़ाइल उत्पन्न करता है। इसलिए, परीक्षण का एक आसान तरीका यह है कि संकलन करने से फर्क पड़ता है कि आपकी स्क्रिप्ट को एक फ़ंक्शन (जैसे मुख्य ()) में बदलना होगा। यदि आप उस स्क्रिप्ट को सहेजते हैं example.pyतो निम्न पंक्तियों के साथ एक और फ़ाइल बनाएँ:

import example
example.main() # call your script(s)

यदि आप स्क्रिप्ट के भीतर से चल रहे हैं, और आयात होने पर चल रहे हैं, तो शायद आप देख सकते हैं कि अंतर क्या है। यह हालांकि यह करने का एक कम तकनीक तरीका है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.