आर्कगिसस्क्रिप्टिंग और बड़े स्थानिक डेटा सेटों का प्रदर्शन


38

मैं वर्तमान में एक यथोचित बड़े डेटा सेट (कुल 10,000 रिकॉर्ड) को संसाधित करने के लिए आर्कगिसस्क्रिप्टिंग मॉड्यूल का उपयोग करते हुए एक पाइथन स्क्रिप्ट लिख रहा हूं, जो कि कुल तालिकाओं की एक छोटी संख्या से अधिक है, कुल 8। इस प्रक्रिया में निर्देशांक के लिए तालिकाओं (x, y) के आधार पर एक फीचर बनाने और अन्य 7 तालिकाओं में रिश्तों का उपयोग करके एक ग्राफ (नोड्स और लाइन्स) बनाना शामिल है। अंतिम आउटपुट नोड्स और किनारों के स्थानिक डेटा सेट के साथ एक व्यक्तिगत जियोडैटेबेस (pgdb / fgdb) है जो नेत्रहीन रूप से रिश्तों का प्रतिनिधित्व करता है।

मेरा प्रारंभिक प्रयास नए जियोडेटबेस टेबल्स और SearchCursor रिकॉर्ड सेट के प्रश्नों का उपयोग करने के लिए कई-कई रिश्तों के लिए लिंक टेबल्स (InsertCursor) को पॉप्युलेट करने के लिए होता है। 15-20 मिनट के प्रसंस्करण समय को छोड़कर, इसने बहुत अच्छा काम किया।

पायथन में cProfiler मॉड्यूल का उपयोग करते हुए, यह स्पष्ट था कि कर्सर (खोज और सम्मिलित करें कर्सर) के अनुरोधों के साथ लिंक तालिकाओं को पॉप्युलेट करने के लिए खोज क्वेरी का प्रदर्शन करते समय एक व्यक्तिगत जियोडेटाबेस को iler थ्रेशिंग ’करना भयावह प्रदर्शन का कारण बना।

थोड़े से रीफैक्टरिंग के साथ मैं प्रसंस्करण समय को 2.5 मिनट से कम करने में कामयाब रहा। व्यापार बंद कोड में जियोडैटेबेस स्कीमा का आंशिक निर्माण था और सभी संबंधों को एक बार सम्‍मिलित होने के बाद इंसर्टसर्किटर्स को इंसर्ट करने के अनुरोध को सीमित कर दिया।

मेरा प्रश्न प्रदर्शन में से एक है;

  • बड़े डेटा सेट के साथ काम करते समय लोगों ने उचित गणना समय को बनाए रखने के लिए किन तकनीकों का उपयोग किया है?
  • क्या कोई ईएसआरआई अनुशंसित तरीके हैं जो मैंने अनुकूलन के लिए अपनी खोज में याद किए हैं?

    मैं आर्कगिसस्क्रिप्टिंग कर्सर बनाते समय किए गए ओवरहेड को समझता हूं, खासकर अगर यह एक व्यक्तिगत जियोडेटाबेस से है, हालांकि इस साइट और Google से प्रदर्शन से संबंधित उत्तर की लंबी खोज के बाद मैं इस धारणा के तहत हूं कि प्रदर्शन लोगों के प्रयासों में सबसे आगे नहीं है ।

  • ESRI उत्पादों के उपयोगकर्ता के रूप में, क्या कोई इन प्रदर्शनों की अपेक्षा करता है और इसकी पुष्टि करता है?

अद्यतन करें

इस उत्पाद के साथ कुछ काम करने के बाद मैंने ऑप्टिमाइज़ेशन तकनीकों की एक सूची जमा की है, जिसने एक स्थानिक प्रारूप से एक जियोडेटाबेस के लिए स्थानिक जानकारी को परिवर्तित करने की एक प्रक्रिया ली है। यह व्यक्तिगत और फ़ाइल जियोडेटाबेस के लिए विकसित किया गया है। छोटी-मोटी बातें:

  1. आप डेटा पढ़ें और इसे मेमोरी में तर्कसंगत बनाएं। इससे आपका समय आधा कट जाएगा।

  2. मेमोरी में फीचर क्लास और टेबल बनाएं। अपनी मेमोरी को राम डिस्क के रूप में उपयोग करने के लिए फीचर डेटासेट कीवर्क 'in_memory' का उपयोग करें, वहां अपने कार्य करें और फिर डिस्क पर लिखें

  3. डिस्क के लिए लिखने के लिए सुविधा वर्गों के लिए CopyFeatureclass का उपयोग करें, और तालिकाओं के लिए CopyRow।

इन 3 चीजों ने एक स्क्रिप्ट ली जिसमें 100,000+ विशेषताओं को 30 मिनट से 30 - 40 सेकंड तक एक जियोडेटाबेस में परिवर्तित किया गया, इसमें रिश्ते वर्ग शामिल हैं। उन्हें हल्के ढंग से उपयोग नहीं किया जाना है, ऊपर दी गई अधिकांश विधियां बहुत अधिक मेमोरी का उपयोग करती हैं, जो आपको ध्यान न देने पर मुद्दों का कारण बन सकती हैं।


1
क्या आपने किसी भिन्न संग्रहण प्रारूप का उपयोग करने की कोशिश की है? फ़ाइल जियोडैटेबेस कैसे करता है?
डेरेक स्विंगली

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

2
यह अब आपकी मदद नहीं करता है, लेकिन Python में 10.1 कर्सर प्रदर्शन में नए डेटा एक्सेस मॉड्यूल के साथ एक विशाल कारक (औसत मामलों पर परिमाण सीमा के क्रम में) द्वारा सुधार किया गया है।
जेसन शहीर 20

In_memory का उपयोग करता है एक InMemoryWorkspace edndoc.esri.com/arcobjects/9.2/ComponentHelp/esriDataSourcesGDB/... जो, पंक्तियों की एक मनमाना संख्या, के बाद एक ScratchWorkspaceFactory (यानी FileGDB) के लिए सब कुछ उदासीनता और FileGDB पर निर्भर करता है सब काम करने के लिए
रागी यासिर बुरहूम

जवाबों:


56

हालांकि यह सवाल पहले से ही उत्तर दिया गया था, मुझे लगा कि मैं अपने दो सेंट में झंकार कर सकता हूं।

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

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

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 बाउंड ऑपरेशन के बीच अंतर को समझें

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

मेरे दो सेंट।


5
धन्यवाद। मुझे इस पोस्ट को लिखने के बजाय काम करना चाहिए था
रागी यश बुरहूम

3
+1 आपके इनपुट श्री बुरहुम के लिए बहुत बहुत धन्यवाद। यह प्रतिक्रिया का प्रकार है जिसे मैं प्राप्त करना चाहता था। अगर मैं इसे दो बार वोट कर सकता था !! आर्कगिसस्क्रिप्टिंग (अजगर) उपयोगकर्ताओं को इस उत्तर से लेना चाहिए, हालांकि लिंक आर्कओबजेक्ट्स और .नेट अवधारणाओं को दर्शाते हैं, अंतर्निहित COM ऑब्जेक्ट एक समान हैं, इन वस्तुओं को समझना आपको किसी भी भाषा में बेहतर योजना कोड बनाने में मदद करेगा। बहुत सारी शानदार जानकारी यहाँ !!
ऑप्टिमाइज़प्राइम

1
@OptimizePrime यह एक महान सारांश है। और आप सही हैं - यदि आप ईएसआरआई उत्पादों से प्रदर्शन को निचोड़ना चाहते हैं तो आप आर्कबोज के निहितार्थों को नजरअंदाज नहीं कर सकते
रागी यासेर बुरहूम

1
धन्यवाद, मैंने कर्सर डालने के द्वारा स्टोर () को बदल दिया और अपने अनुप्रयोगों में बहुत समय बचाया!
सुपरक्रैच

5

आम तौर पर, प्रदर्शन संगणना के लिए, मैं किसी भी ESRI संबंधित सामान का उपयोग करने से दूर रहने की कोशिश करता हूं। आपके उदाहरण के लिए, मैं चरणों में प्रक्रिया करने का सुझाव दूंगा, पहला कदम डेटा को सामान्य अजगर वस्तुओं में पढ़ना, गणना करना और फिर अंतिम चरण अंतिम ईएसआरआई स्थानिक प्रारूप में परिवर्तित करना। ~ 10k रिकॉर्ड के लिए, आप संभवतः प्रसंस्करण के लिए स्मृति में सब कुछ संग्रहीत करने के साथ दूर हो सकते हैं, जो एक निश्चित प्रदर्शन लाभ देगा।


आपकी प्रतिक्रिया के लिए धन्यवाद। यह एक अच्छा सुझाव है। मैंने आर्कगिसस्क्रिप्टिंग का उपयोग करने से पहले आवश्यक प्रक्रियाओं को करने के लिए कोड को रिफलेक्टर करना शुरू कर दिया है। अपने ArcInfo दिनों के बाद से सॉफ्टवेयर के साथ काम करने के बाद मुझे यह निराशा होती है कि CPU प्रदर्शन और हार्डवेयर क्षमता में वृद्धि, ArcGIS मैप / जानकारी / संपादक XX प्रदर्शन स्थिर है। शायद GPU की शुरूआत चीजों को बढ़ावा दे सकती है। हालांकि ESRI कोड आधार का एक अच्छा रिफ्लेक्टर भी मदद कर सकता है
OptimizePrime

1

आपके पास मौजूद हार्डवेयर के आधार पर, आप ESRI Geocoder उदाहरण में प्रदर्शित विकल्प पर भी विचार कर सकते हैं; यह आपको एक बड़े डेटासेट को तोड़ने और आपको बहु-थ्रेडेड दृष्टिकोण देने के लिए अजगर के कई उदाहरण चलाने के लिए एक रूपरेखा प्रदान करता है। मैंने देखा कि जियोकोडिंग का प्रदर्शन 180,000 प्रति घंटे से एक एकल पायथन उदाहरण में मेरी मशीन पर 8 समानांतर प्रक्रियाओं को पूरा करने के लिए एक मिलियन से अधिक धन्यवाद है।

मैंने देखा है कि डेटाबेस में डेटा काम करते हुए जितना हो सके उतना दूर रहना चाहिए, और मेरे टेबल में कार्यात्मक काम करना और ईएसआरआई दायरे में स्पष्ट जीआईएस का उपयोग करने से प्रमुख प्रदर्शन बढ़ता है।


ये महान विचार हैं। मुझे इस स्क्रिप्ट में कुछ प्रक्रियाओं को थ्रेड करने का अवसर मिला है, लेकिन मुझे पता चल रहा है कि मेरी बोतल गर्दन COM लाइब्रेरीज़ और जियोडेटाबेस I / O की शुरुआत कर रही है। I / O के संबंध में, मैंने एक लिखने की आवश्यकता को कम कर दिया है। यदि मैं किसी भी अधिक समय को अनुकूलित करने में बिताता हूं, तो मेरे बॉस के पास एक फिट होने जा रहा है;) इसलिए मैं प्रदर्शन के अंतिम निचोड़ के रूप में थ्रेडिंग छोड़ रहा हूं यदि वह अधिक मांगता है। फिलहाल मैं एक मिनट में 60,000 फीचर्स प्रोसेस कर रहा हूं।
ऑप्टिमाइज़प्रेम

0

आपको ये अन्य फ़ोरम पोस्ट दिलचस्प लग सकती हैं क्योंकि वे अनुकूलन संदर्भ में हैं, लेकिन रेखापुंज डेटा और समग्र के लिए:

पायथन लिपियों को संकलित करना जो आर्कगिस जियोप्रोसेसिंग टूल का उपयोग करते हैं?

ArcGIS हाइड्रोलॉजी टूलबॉक्स टूल का स्टैंडअलोन पायथन लिपि बनाम ArcCatalog में उपयोग करने का समय?

gp.scratchworkspace सेटिंग ने मेरे लिए कुछ अजगर कोड में एक बड़ा अंतर किया, जो मैंने वाटरशेड परिसीमन करने के लिए लिखा था।

क्या आप कुछ कोड उदाहरणों को पोस्ट कर सकते हैं जो आपके मूल प्रश्न में आपके UPDATE में नंबर 1 और 2 प्रदर्शित करते हैं? मुझे उस के यांत्रिकी को देखने में दिलचस्पी होगी (हालांकि मैं मान रहा हूं कि आप केवल यहां फीचर क्लास डेटा के साथ काम कर रहे हैं)

धन्यवाद, टॉम

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