हालांकि यह सवाल पहले से ही उत्तर दिया गया था, मुझे लगा कि मैं अपने दो सेंट में झंकार कर सकता हूं।
अस्वीकरण : मैंने कुछ वर्षों के लिए जियोडाटाबेस टीम में ईएसआरआई के लिए काम किया और जियोडाटाबेस कोड (संस्करण, कर्सर, संपादन सत्र, इतिहास, संबंध कक्षाएं, आदि) के विभिन्न भागों को बनाए रखने के प्रभारी थे।
मुझे लगता है कि ईएसआरआई कोड के साथ प्रदर्शन समस्याओं का सबसे बड़ा स्रोत विभिन्न वस्तुओं का उपयोग करने के निहितार्थ को नहीं समझ रहा है, विशेष रूप से, विभिन्न जियोडाटबेस अमूर्त के "छोटे" विवरण! तो बहुत बार, वार्तालाप भाषा को प्रदर्शन के मुद्दों के अपराधी के रूप में इस्तेमाल किया जा रहा है। कुछ मामलों में यह हो सकता है। लेकिन हर समय नहीं। आइए भाषा चर्चा से शुरुआत करें और अपने तरीके से काम करें।
1.- प्रोग्रामिंग लैंग्वेज जिसे आप तभी चुनते हैं जब आप कुछ ऐसा कर रहे हैं जो जटिल है, एक तंग लूप में। ज्यादातर समय, यह मामला नहीं है।
कमरे में बड़ा हाथी यह है कि सभी ESRI कोड के मूल में, आपके पास ArcObjects हैं - और ArcObjects COM का उपयोग करके C ++ में लिखे गए हैं । इस कोड के साथ संचार करने के लिए एक लागत है। यह C #, VB.NET, अजगर, या जो भी आप उपयोग कर रहे हैं, उसके लिए सही है।
आप उस कोड के आरंभ पर एक मूल्य का भुगतान करते हैं। यदि आप इसे केवल एक बार करते हैं तो यह एक नगण्य लागत हो सकती है।
फिर आप हर बाद के समय के लिए एक मूल्य का भुगतान करते हैं जो आप ArcObjects के साथ बातचीत करते हैं।
व्यक्तिगत रूप से, मैं अपने ग्राहकों के लिए C # में कोड लिखना चाहता हूं, क्योंकि यह काफी आसान और तेज है। हालाँकि, हर बार जब मैं डेटा को इधर-उधर करना चाहता हूं या बड़ी मात्रा में डेटा के लिए कुछ प्रोसेसिंग करता हूं जो पहले से ही जियोप्रोसेसिंग में लागू है, मैं स्क्रिप्टिंग सबसिस्टम को इनिशियलाइज़ करता हूं और अपने मापदंडों में पास करता हूं। क्यूं कर?
- यह पहले से ही लागू है। तो पहिया को क्यों मजबूत करें?
- यह वास्तव में तेज हो सकता है । "तेजी से इसे सी # में लिखने से?" हाँ! यदि मैं मैन्युअल रूप से डेटा लोड करना, कहना, लागू करता हूं, तो इसका मतलब है कि मैं एक तंग पाश में .NET संदर्भ स्विचिंग की कीमत का भुगतान करता हूं। हर GetValue, Insert, ShapeCopy की एक लागत है। यदि मैं GP में एक कॉल करता हूं, तो संपूर्ण डेटा लोडिंग प्रक्रिया GP के वास्तविक कार्यान्वयन में होगी - C ++ में COM वातावरण के भीतर। मैं संदर्भ स्विचिंग के लिए मूल्य का भुगतान नहीं करता हूं क्योंकि कोई भी नहीं है - और इसलिए यह तेज है।
आह हाँ, तो फिर समाधान अगर बहुत से लोगों के कार्यों का उपयोग करने के लिए। दरअसल, आपको सावधान रहना होगा।
2. जीपी एक ब्लैक बॉक्स है जो डेटा को कॉपी करता है (संभवतः अनावश्यक रूप से)
यह एक दोधारी तलवार है। यह एक ब्लैक बॉक्स है जो आंतरिक रूप से कुछ जादू करता है और परिणामों को बाहर निकालता है - लेकिन वे परिणाम बहुत बार दोहराए जाते हैं। 100,000 पंक्तियों को आसानी से डिस्क पर 1,000,000 पंक्तियों में परिवर्तित किया जा सकता है, जब आप अपने डेटा को ९ विभिन्न कार्यों के माध्यम से चलाते थे। केवल GP फ़ंक्शन का उपयोग करना एक रैखिक GP मॉडल बनाने जैसा है, और अच्छी तरह से ...
3. बड़े डेटासेट के लिए बहुत अधिक जीपी फ़ंक्शन का उपयोग करना अत्यधिक अक्षम है। एक जीपी मॉडल (संभवतः) एक क्वेरी को वास्तव में वास्तव में गूंगा तरीके से निष्पादित करने के बराबर है
अब मुझे गलत मत समझो मुझे GP मॉडल बहुत पसंद है - यह मुझे हर समय कोड लिखने से बचाता है। लेकिन मैं यह भी जानता हूं कि यह बड़े डेटासेट को संसाधित करने का सबसे कुशल तरीका नहीं है।
क्या आपने हर एक क्वेरी प्लानर के बारे में सुना है ? यह काम है कि आप उस एसक्यूएल स्टेटमेंट को देखें जिसे आप निष्पादित करना चाहते हैं, एक निर्देशित ग्राफ के रूप में एक निष्पादन योजना तैयार करें जो कि जीपी मॉडल की तरह बहुत अधिक हो , डीबी में संग्रहीत आँकड़ों को देखें, और सबसे अधिक चुनें उन्हें निष्पादित करने के लिए इष्टतम आदेश । जीपी सिर्फ उन चीजों को अंजाम देता है, जिनमें आप चीजों को डालते हैं क्योंकि इसमें कुछ भी समझदारी से करने के लिए आँकड़े नहीं होते हैं - आप क्वेरी प्लानर हैं । और अंदाज लगाइये क्या? जिस क्रम में आप चीजों को निष्पादित करते हैं वह आपके डेटासेट पर बहुत निर्भर करता है। जिस क्रम में आप चीजों को निष्पादित करते हैं, वह दिनों और सेकंड के बीच अंतर कर सकता है और यह आपको तय करना है।
"महान" आप कहते हैं, मैं खुद चीजों को स्क्रिप्ट नहीं करूंगा और इस बात से सावधान रहूंगा कि मैं कैसे सामान लिखूं। लेकिन क्या आप समझते हैं कि जियोडाटबेस अमूर्तताएं हैं?
4.नहीं समझ जियोदाटबेस अमूर्त आप आसानी से काट सकते हैं
हर एक बात को इंगित करने के बजाय, जो संभवतः आपको एक समस्या दे सकती है, मुझे केवल कुछ सामान्य गलतियों को इंगित करना चाहिए जो मैं हर समय और कुछ सिफारिशों को देखता हूं।
- रीसायकलिंग कर्सर के लिए True / False के बीच अंतर को समझना । यह छोटा सा झंडा जो सच में सेट है, वह परिमाण के क्रम को तेज़ी से बढ़ा सकता है।
- डेटा लोड के लिए अपनी तालिका LoadOnlyMode में रखें । क्यों हर डालने पर सूचकांक को अपडेट करें?
- यह समझें कि भले ही IWorkspaceEdit :: StartEditing सभी कार्यक्षेत्रों में समान दिखता है, लेकिन वे प्रत्येक डेटा स्रोत पर बहुत भिन्न जानवर हैं। एंटरप्राइज GDB पर, आपके पास लेनदेन के लिए संस्करण या समर्थन हो सकता है। शेपफाइल्स पर, इसे बहुत अलग तरीके से लागू करना होगा। आप पूर्ववत् / फिर से कैसे लागू करेंगे? क्या आपको इसे सक्षम करने की आवश्यकता है (हाँ, यह मेमोरी उपयोग में अंतर कर सकता है)।
- बैच संचालन या एकल पंक्ति संचालन के बीच अंतर। बिंदु GetRow बनाम GetRows में मामला - यह एक पंक्ति को प्राप्त करने के लिए या कई पंक्तियों को लाने के लिए एक क्वेरी करने के बीच का अंतर है। GetRow के कॉल के साथ एक तंग लूप का मतलब है भयानक प्रदर्शन और यह प्रदर्शन के मुद्दों का # 1 अपराधी है
- UpdateSearchedRows का उपयोग करें
- CreateRow और CreateRowBuffer के बीच अंतर को समझें । सम्मिलित रनटाइम में भारी अंतर।
- यह समझें कि IRow :: Store और IFeature :: Store सुपर हेवी पॉलीमॉर्फिक ऑपरेशन चलाता है । यह वास्तव में धीमी गति से प्रदर्शन के कारण # 2 अपराधी है। यह केवल पंक्ति को सहेजता नहीं है, यह वह विधि है जो यह सुनिश्चित करती है कि आपका ज्यामितीय नेटवर्क ठीक है, कि आर्केप संपादक को सूचित किया जाता है कि एक पंक्ति बदल गई है, जो उन सभी संबंध वर्गों को सूचित करता है जिनका इस पंक्ति के साथ कुछ भी करना मान्य है सुनिश्चित करें कि कार्डिनैलिटी वैध है, आदि। आपको इसके साथ नई पंक्तियाँ नहीं डालनी चाहिए, आपको एक इन्सर्टसुसर का उपयोग करना चाहिए !
- क्या आप एक आवेषण में उन आवेषणों को करना चाहते हैं? आप करते हैं या नहीं, इससे बहुत फर्क पड़ता है। कुछ ऑपरेशनों के लिए इसकी आवश्यकता होती है (और चीजों को धीमा बनाते हैं), लेकिन जब आपको इसकी आवश्यकता नहीं होती है, तो पूर्ववत करें / फिर से करें सुविधाओं को छोड़ दें।
- कर्सर महंगे संसाधन हैं। एक बार जब आप एक को संभाल लेते हैं, तो आपको गारंटी दी जाती है कि आपके पास संगतता और अलगाव होगा और इसकी लागत है।
- डेटाबेस कनेक्शन जैसे कैश अन्य संसाधन (अपना कार्यक्षेत्र संदर्भ न बनाएं और नष्ट करें) और टेबल हैंडल (हर बार जब आप खोलते हैं या एक को बंद करते हैं - तो कई मेटाडेटा तालिकाओं को पढ़ने की आवश्यकता होती है)।
- FeatureDataset के अंदर या बाहर FeatureClasses लगाने से परफॉर्मेंस पर बहुत फर्क पड़ता है। यह एक संगठनात्मक विशेषता के रूप में नहीं है !
5.और अंतिम और कम से कम ...
I / O बाउंड और CPU बाउंड ऑपरेशन के बीच अंतर को समझें
मैंने ईमानदारी से उन सभी वस्तुओं में से हर एक पर अधिक विस्तार करने के बारे में सोचा था और शायद उन सभी में से हर एक विषय को शामिल करने वाली ब्लॉग प्रविष्टियों की एक श्रृंखला कर रहा था, लेकिन मेरे कैलेंडर की बैकलॉग सूची ने मुझे चेहरे पर थप्पड़ मारा और मुझ पर चिल्लाना शुरू कर दिया।
मेरे दो सेंट।