पायथन में आर्कगिस कर्सर का उपयोग करते समय बड़े तालिकाओं के साथ प्रदर्शन में सुधार कैसे करें?


10

मेरे पास फ़ाइल जियोडेटाबेस (~ 4 000 000 रिकॉर्ड) में एक बहुत बड़ा बिंदु सुविधा वर्ग है। यह 100 मीटर रिज़ॉल्यूशन वाले अंकों का एक नियमित ग्रिड है।

मुझे इस परत पर एक तरह का सामान्यीकरण करने की आवश्यकता है। इसके लिए, मैं एक नया ग्रिड बनाता हूं जहां प्रत्येक बिंदु 4 "पुराने" बिंदुओं के बीच में स्थित है:

 *     *     *     *
    o     o     o
 *     *     *     *
    o     o     o
 *     *     *     *

[*] = मूल ग्रिड का बिंदु - [o] = नए ग्रिड का बिंदु

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

यहां कोई पद्धति जटिल नहीं है, लेकिन मेरी समस्या यह है कि, मेरे पहले परीक्षणों के आधार पर, यह स्क्रिप्ट पूरी होने के लिए हफ्तों तक चलेगी ...

क्या आप इसे अधिक कुशल बनाने की कोई संभावना देखते हैं? मेरे सिर के शीर्ष पर कुछ विचार:

  • क्षेत्रों को अनुक्रमित करें X और Y => मैंने ऐसा किया, लेकिन किसी भी महत्वपूर्ण प्रदर्शन परिवर्तन पर ध्यान नहीं दिया
  • विशेषता-आधारित के बजाय पड़ोसियों को खोजने के लिए एक स्थानिक क्वेरी करें। क्या यह वास्तव में मदद करेगा? ArcGIS में स्थानिक कार्य क्या करना चाहिए? मुझे संदेह है कि, उदाहरण के लिए, प्रत्येक नए बिंदु को बफर करना अधिक कुशल साबित होगा
  • एक NumPy Array में फीचर क्लास ट्रांसफ़ॉर्म करें। क्या इससे मदद मिलेगी? मैंने अब तक NumPy के साथ बहुत काम नहीं किया है और मैं इसमें डुबकी नहीं लेना चाहूंगा जब तक कि कोई मुझे नहीं बताता कि यह वास्तव में प्रसंस्करण समय को कम करने में मदद कर सकता है
  • और कुछ?

आर्कमैप के किस संस्करण का आप उपयोग कर रहे हैं?
मार्टिन

क्या आपने PostGIS पर विचार किया है? क्या वह विकल्प है?
चाड कूपर

क्षमा करें कि मैं यह भूल गया कि: ArcGIS 10.1 // पायथन 2.7
स्टीफन हेनरिओड

नहींं, PostGIS दुर्भाग्य से एक विकल्प नहीं है, मेरे हाथ दुर्भाग्य से काफी बंधे हुए हैं ... सबसे अच्छा मैं Oracle का उपयोग SDE फ़ंक्शंस के साथ कर सकता हूं
स्टीफन हेनरिओड

जवाबों:


13

क्या होगा यदि आपने अंकों को एक सुव्यवस्थित सरणी में खिलाया है और पड़ोसियों की तलाश के लिए एक डरावना cKDTree का उपयोग किया है। मैं इस तकनीक का उपयोग करके कई मिनटों में बड़ी संख्या में (> 20 मिलियन) के साथ LiDAR बिंदु बादलों को संसाधित करता हूं। प्रलेखन नहीं है यहाँ kdtree के लिए और यहाँ numpy रूपांतरण के लिए। मूल रूप से, आप एक बिंदु में x, y को एक सरणी में पढ़ते हैं, और प्रत्येक बिंदु पर एक निश्चित दूरी (पड़ोस) के भीतर बिंदुओं के सूचक ढूंढने वाले सरणी में प्रत्येक बिंदु पर पुनरावृति करते हैं। आप इन सूचकांकों का उपयोग तब अन्य विशेषताओं की गणना करने के लिए कर सकते हैं।


यह उत्तर मेरे से बेहतर है
radouxju

मुझे यह विचार पसंद है, लेकिन मैं जिस कार्य केंद्र (और कोई व्यवस्थापक अधिकार नहीं) पर काम कर रहा हूं, उस पर मुझे डर नहीं है। अगर मैं इस पैकेज को स्थापित करने का प्रबंधन करता हूं, तो मैं इसे
आजमाऊंगा

4

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

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

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


मैं वास्तव में शब्दकोशों के साथ आपके विचार को पसंद करता हूं और मैंने इसे लागू किया है। यह वास्तव में बहुत बेहतर काम करता है ... जब तक मैं वास्तव में एक row.insertRow () के साथ परिणाम नहीं लिखता ... किसी भी विचार मैं इस भाग को भी कैसे सुधार सकता हूं?
स्टीफन हेनरिओड

मुझे भी इसी तरह की समस्या थी जहाँ मुझे 14 Mio में से कुछ 10.000 अंक चुनने थे। और फिर इसे हटा दें। arcpy.cursors जहां केवल 1 या 2 अंक प्रति सेकंड (!) को हटाने में सक्षम है। इसलिए मैंने केवल एक सेकंड में एकल SQL DELETE स्टेटमेंट के साथ उन्हें हटाने के लिए pyodbc मॉड्यूल स्थापित किया। SQL पर UPDTATE करने से आपको बहुत सुधार आएगा, जब तक आप केवल विशेषताओं को संशोधित करना चाहते हैं ... फिर भी आपको अतिरिक्त अजगर मॉड्यूल स्थापित करना होगा ... लेकिन यह इसके लायक है।
जरगेन जोर्निग

2

एक नियमित ग्रिड के लिए, रेखापुंज प्रारूप में काम करने के लिए यह कहीं अधिक कुशल होना चाहिए। अपनी पहली ग्रिड को एक रेखापुंज में परिवर्तित करें, आप बिलिनियर इंटरपोलर का उपयोग करके एक ही रिज़ॉल्यूशन में फिर से भर सकते हैं लेकिन अपनी आउटपुट इमेज को 1/2 पिक्सेल X और Y में बदल सकते हैं, और यदि आपको अभी भी पॉइंट्स की आवश्यकता है, तो इसे फिर से पॉइंट करें।

EDIT: जटिल निर्णय नियमों के लिए, आप प्रत्येक फ़ील्ड को एक नए रैस्टर बैंड के रूप में परिवर्तित कर सकते हैं, फिर आप उन बैंडों की चार प्रतियां बनाते हैं और आप 1/2 पिक्सेल (+50) द्वारा 4 दिशाओं में आपको रेखापुंज करते हैं, - 50), (+ 50, + 50), (-50, -50) और (-50, + 50)। फिर आप नियमित मानचित्र बीजगणित का उपयोग कर सकते हैं


धन्यवाद मैंने वास्तव में इस समाधान के बारे में सोचा है, लेकिन मुझे यकीन नहीं है कि अगर मैं रास्टर प्रारूप में नए मूल्य की गणना को लागू कर सकता हूं या नहीं। मुझे समझाने दो: प्रत्येक नए बिंदु (या नए रेखापुंज सेल) के लिए मुझे इसके मूल्य की गणना करने की आवश्यकता है जैसे: मैं इसके प्रत्येक पड़ोसी का मूल्य लेता हूं। उन मूल्यों में से प्रत्येक में नए बिंदु पर एक विशेष मूल्य देने की संभावना है। जैसे, यदि किसी पड़ोसी का मान 202 है, तो वह मान 3 (1 के वजन के साथ) या मान 11 (5 के वजन के साथ) देगा। फिर हम सभी 4 पड़ोसियों के लिए योग करते हैं और नए मूल्य पाते हैं ... यकीन नहीं होता कि क्या यह बहुत स्पष्ट है ...
स्टीफन हेनरिओड

पुनश्च: नए मान को खोजने के लिए गणना, कुछ मामलों में, 2 विशेषताओं पर आधारित हो सकती है, न कि केवल एक, जो रैस्टर दृष्टिकोण को त्याग सकती है
स्टीफन हेनरिओड

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

1
@ StéphaneHenriod - एक सुझाव के रूप में, आप इन अतिरिक्त विशिष्टताओं को जोड़ने के लिए प्रश्न को संपादित करने पर विचार कर सकते हैं। प्रारंभिक प्रश्न को देखते हुए, मुझे लगता है कि यह जवाब बहुत मायने रखता है, लेकिन इस नई जानकारी के साथ, बारब्रोसा का जवाब अच्छा लग रहा है।
निक्सन

2

आपकी मदद के लिए सभी को धन्यवाद!

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


0

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

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

समस्या यह है कि यदि आप एक कर्सर से पुनर्प्राप्त सुविधाओं को संग्रहीत करने की योजना बना रहे हैं तो आप रीसाइक्लिंग को सक्षम नहीं कर सकते।


मैं इस "रीसायकल कर्सर" विषय का पता लगाना चाहता हूं, लेकिन ईएसआरआई मदद पर कोई दस्तावेज नहीं खोज सकता। क्या आपके पास एक लिंक है? खोज कर्सर का कोई रीसायकल पैरामीटर नहीं है। Select_by_Attribute के पास ऐसा कोई पैरामीटर नहीं है। मुझे ईएनवी में कुछ भी नहीं दिख रहा है।
क्लेविस

मैंने कुछ समय पहले एक लेख लिखा था हुसैनासेर.com
2009/

1
मुझे नहीं लगता कि "पुन: उपयोग करने वाले कर्सर" आर्कपी के माध्यम से उपलब्ध हैं, केवल मुख्य आर्कोबिज के साथ।
क्लेविस २०'१४
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.