क्या कोई तरीका है जिससे मैं भू-स्थानिक डेटा के लिए की-वैल्यू स्टोर का उपयोग कर सकता हूं?


26

मैंने अतीत में कई रिलेशनल डेटाबेस का उपयोग किया है, लेकिन मैंने सभी NoSQL डेटाबेस के बारे में भी पढ़ा है, और की-वैल्यू स्टोर इंटररिटिंग दिखता है।

जब मैं ज्यामितीय वस्तु को स्टोर करता हूं तो मैं ज्यादातर पांच अनुक्रमित कॉलम आईडी, MIN_X, MAX_X, MIN_Y और MAX_Y (जहां X और Y एक मानचित्र प्रक्षेपण में हैं) का उपयोग करता हूं। मुझे अपने अन्य डेटा पर एक इंडेक्स की आवश्यकता नहीं है।

मुझे एक निर्दिष्ट स्थान (मानचित्र आयत) में वस्तुओं को देखने के लिए X और Y मानों की आवश्यकता है, और अगर मुझे एक निर्दिष्ट ऑब्जेक्ट को अपडेट करना है तो मुझे आईडी मान की आवश्यकता है।

क्या कोई तरीका है कि मैं इसके लिए की-वैल्यू स्टोर का उपयोग कर सकता हूं?

जवाबों:


18

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

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

ग्रिड - एक निश्चित क्षेत्र के लिए सभी सुविधाओं को एक ज्ञात ग्रिड इंडेक्स में पैक करें। ग्रिड पर एक छोटा स्थानिक सूचकांक रखें ताकि आप उन सुविधाओं के सेट को जल्दी से नेविगेट कर सकें जिनमें यह शामिल है। अधिकांश प्रश्नों के लिए, आपको केवल मुट्ठी भर ग्रिडों को खींचना होगा, जो तेज हो, क्योंकि आपको सटीक ग्रिड नामकरण सम्मेलन पता है और यह K / V संस्थाओं से संबंधित है (प्रश्न नहीं मिलते हैं)

पेशेवरों - बहुत तेज़, लागू करने में आसान, कोई मेमोरी फ़ुटप्रिंट नहीं।

विपक्ष - पहले से आवश्यक, उपयोगकर्ता को ग्रिड आकार तय करने की आवश्यकता होती है, बड़े भूगर्भ कई ग्रिडों पर साझा किए जाते हैं, क्लस्टरिंग के कारण ग्रिड ओवरलोड हो सकते हैं, क्रमांकन / डीसेरिएलाइज़ेशन लागत एक मुद्दा हो सकता है (जब भी बफर के माध्यम से संकुचित किया जाता है)

QuadKeys - यह वर्तमान कार्यान्वयन है। मूल रूप से ग्रिड के रूप में ही है इसके अलावा ग्रिड स्तर नहीं है। जैसा कि सुविधाओं को जोड़ा जाता है, उन्हें क्वाडकी ग्रिड द्वारा अनुक्रमित किया जाता है जिसमें पूरी तरह से उनकी सीमाएं होती हैं (या कुछ मामलों में, दो में विभाजित हो जाती हैं जब एक भी क्वाडकी का उपयोग नहीं किया जा सकता है, डेटलाइन लगता है)। क्यूक पाए जाने के बाद, फिर इसकी अधिकतम संख्या को छोटे क्यूके में विभाजित किया जाता है जो कि सुविधा के महीन दाने का प्रतिनिधित्व प्रदान करते हैं। उस सुविधा के लिए एक पॉइंटर / बॉक्स को फिर एक हल्के ग्रिडिंडेक्स (सुविधाओं के समूह) में पैक किया जाता है, जिसे क्वेरी किया जा सकता है (एक मूल डिज़ाइन ने सुविधाओं को सीधे रूप से उद्धृत किया लेकिन यह उन मामलों में बहुत धीमा / सीपीयू गहन साबित हुआ जहां परिणाम बड़ा था)

Polyline Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_1.png बहुभुज Quadkeys http://www.arc2earth.com/images/help/GAE_QKS_2.png

ऊपर इस्तेमाल किया गया क्वाडकी नामकरण सम्मेलन अच्छी तरह से जाना जाता है और अधिक महत्वपूर्ण बात, स्थानीयता को संरक्षित करने के लिए जाता है ( यहां अधिक वर्णित है )

ऊपर का बहुभुज कुछ इस तरह दिखता है: 0320101013123 03201010131212 03201010131213 032010101313232 0320101013133 03201010131302 0320101013131 032010101313002 032010101313002 032010101313003 032010101313003 032010101313127 मोबाइल नंबर से संपर्क करें।

यदि क्वेरी सीमा काफी छोटी है, तो आप सीधे qk के माध्यम से ला सकते हैं। यह इष्टतम है क्योंकि इसकी एकमात्र एकल, बैच rpc कॉल GAE डेटॉल के लिए है। यदि सीमा पर्याप्त रूप से बड़ी है कि इसमें बहुत सारे संभावित qks (> 1000) शामिल हैं, तो आप वैकल्पिक रूप से एक फिल्टर (उदा: qk> = 0320101013 और qk <= 0320101013 + \ ufffd) का उपयोग करके क्वेरी कर सकते हैं। क्वाडकी नामकरण अधिवेशन और जिस तरह से जीएई अनुक्रमित तार ऊपर क्वेरी को केवल मौजूदा ग्रिडों को लाने की अनुमति देता है जो उस क्यू मूल्य से नीचे आते हैं।

अन्य चेतावनी और पूर्ण मुद्दे हैं, लेकिन सामान्य तौर पर, क्वाडकी पर क्वेरी करने की क्षमता है जो इसे संभव बनाती है

उदाहरण - यूएस काउंटियों पर क्वेरी: जियोजोन

पेशेवरों - बहुत तेज़, कोई ग्रिड आकार कॉन्फिगर नहीं, कोई मेमोरी फ़ुटप्रिंट नहीं, कोई भीड़-भाड़ वाला ग्रिड नहीं

विपक्ष - कुछ परिदृश्यों में, किसी भी ध्रुवीय डेटा के लिए आवश्यक ओवरप्रोस्किंग प्रीप्रोसेसिंग

स्पेस फिलिंग कर्व्स - इस साल Google I / O में अल्फ्रेड की नेक्स्टजेन क्वरीज पर एक नज़र डालें । नए मल्टीविके ऑपरेटर्स (समानांतर में रन) के साथ जेनेरिक स्पेस / टाइम फिलिंग कर्व्स को शामिल करने से कुछ वास्तव में शांत स्थानिक प्रश्नों की अनुमति मिलेगी। क्या यह पारंपरिक एसक्यूएल प्रदर्शन को हरा देगा? कहना मुश्किल है लेकिन यह वास्तव में अच्छी तरह से पैमाने पर होना चाहिए। और हम तेजी से एक ऐसे भविष्य की ओर अग्रसर हो रहे हैं, जहाँ हमेशा सभी आकार / आकार के मोबाइल उपकरणों पर नाटकीय रूप से आपकी साइट / सेवा के लिए यातायात बढ़ जाएगा।

अंत में, मैं यह भी मानूंगा कि आपको SQL पर NoSQL चुनने से पहले अपने समस्या डोमेन पर बहुत बारीकी से देखना चाहिए। हमारे मामले में, मुझे वास्तव में GAE का मूल्य निर्धारण मॉडल पसंद आया, इसलिए वास्तव में कोई विकल्प नहीं था लेकिन अगर आपको स्केल करने की आवश्यकता नहीं है, तो अपने आप को कुछ समय बचाएं और बस एक मानक sql db का उपयोग करें


आप जीएई का उल्लेख करते हैं, लेकिन आप किस डेटाबेस का उपयोग कर रहे हैं? कई हैं: Cloud.google.com/products/storage
डॉन मैक्रूडी

11

मैंने जियोच्यूच के बारे में सुना है, जो लोकल आधारित डेटा के लिए काउचबीडी का कार्यान्वयन है। और मुझे यह भी लगता है कि MongoDB में भू-स्थानिक अनुक्रमण क्षमताएँ हैं।


हां, वे दोनों करते हैं, और सिम्पलजीओ कैसेंड्रा के लिए एक स्थानिक विस्तार का निर्माण कर रहा है। मैंने वोल्डेमॉर्ट या
मेमकेच

ओह, मैं प्यार करता हूँ कि SimpleGeo क्या कर रहा है। मैं ईर्ष्या कर रहा हूं और उनके लिए काम करना पसंद करूंगा!
जोशफैनी

8

यह मुख्य रूप से एल्गोरिदम के बारे में एक प्रश्न है। स्टैक ओवरफ्लो भी इसे पूछने के लिए एक अच्छी जगह हो सकती है।

किसी भी स्थिति में, आपके प्रत्यक्ष प्रश्न का उत्तर "हां, आप स्थानिक डेटा का प्रतिनिधित्व करने के लिए एक kvp स्टोर का उपयोग कर सकते हैं।" एक बेहतर सवाल, हालांकि "स्थानिक डेटा का प्रतिनिधित्व करने के लिए मैं kvp स्टोर का उपयोग कर सकता हूं?"

उस सवाल का जवाब (कई अन्य की तरह) है, "यह निर्भर करता है"। यह आपके पैमाने पर निर्भर करता है, आपका (लेन-देन) काम का बोझ, डेटा की प्रकृति और आपके निपटान में कम्प्यूटेशनल बुनियादी ढाँचा।

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

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

अपडेट :

यहाँ थोड़ा और अधिक जानकारी है। स्थानिक लुकअप करने के लिए आप KVP स्टोर का उपयोग कर सकते हैं। समस्या यह है कि यह धीमी है। ऐसा क्यों है, यह देखने के लिए:

  ***********
  ***********
  ***********
  ***********
  ****###****
  ****###****
  ****###****
  ***********
  ***********
  ***********
  ***********

जहां * और # वस्तुओं का प्रतिनिधित्व करते हैं, 11x11 ग्रिड में, शीर्ष बाएं कोने में मूल के साथ रखी गई हैं। आयत (4,4) - (7,7) के भीतर वस्तुओं के लिए एक खोज की कल्पना करो। कि सभी "#" का पता लगाना चाहिए। यह मानते हुए कि आप KVP स्टोर में अपने अनुक्रमित का प्रतिनिधित्व करने के लिए b + -tree का उपयोग कर रहे हैं, आप "X" इंडेक्स या "Y" इंडेक्स का उपयोग करके परिणाम पा सकते हैं। इस मामले में, यह कोई मायने नहीं रखता है। चर्चा के लिए, मैं x अनुक्रमणिका का उपयोग करूँगा। आप "4" के एक्स मान के साथ पहला नोड खोजने के लिए एक्स इंडेक्स में एक लॉग (n) लुकअप करेंगे और फिर b + -ट्री लीफ नोड्स के माध्यम से पुनरावृति करेंगे, जब तक कि आप एक नोड को 7. से अधिक मान के साथ न पाएं। x अनुक्रमणिका के माध्यम से पुनरावृति आप वांछित y श्रेणी के बाहर कुछ भी अस्वीकार कर देंगे।

यह धीमा है। एक बड़े ग्रिड पर इसकी कल्पना करें, एक ही घनत्व के साथ, 100 के * 100 के। का कहना है कि आप केवल 9 रिकॉर्ड खोजने के लिए "300, 000" सूचकांक प्रविष्टियों को स्कैन करने के लिए समाप्त होंगे। यदि आप एक उचित संतुलित आर-ट्री का उपयोग करते हैं, तो, फिर इंडेक्स लुकअप को केवल लगभग 90 रिकॉर्ड्स स्कैन करने की आवश्यकता होगी। यह बहुत बड़ा अंतर है।

हालाँकि, समस्या यह है कि आर-ट्री को संतुलित रखना महंगा है। यही कारण है कि उत्तर "यह निर्भर करता है", और "मुझे यह क्यों करना चाहिए" सवाल "मैं कैसे करूँ" की तुलना में बहुत अधिक महत्वपूर्ण है।

यदि आप रिकॉर्ड दर्ज करते हैं और हटाते हैं, और अधिकतर "ऑब्जेक्ट आईडी" लुकअप करते हैं, और अक्सर "स्थानिक" लुकअप नहीं करते हैं, तो अपने KVP इंडेक्स का उपयोग करने से आपको बेहतर प्रदर्शन मिलेगा जो आप वास्तव में सिस्टम के लिए उपयोग करना चाहते हैं। । हालाँकि, यदि आप सम्मिलित करते हैं या हटाते हैं, लेकिन स्थानिक लुकअप बहुत करते हैं, तो आप R-Tree का उपयोग करना चाहते हैं।


मैं "हाँ, आप कर सकते हैं" जैसे उत्तर को स्वीकार नहीं करेंगे। क्योंकि मैं HOW जानना चाहता हूं । और "SHOULD I .." बेहतर सवाल नहीं है, क्योंकि जैसा कि आपने कहा "यह निर्भर करता है"।
जोनास

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

@ जोनास का मानना ​​है कि आपके द्वारा दिए गए "सलाह" के उत्तर इस तरह से थे क्योंकि आपने प्रश्न पूछा था: "लेकिन मैंने सभी NoSQL डेटाबेस के बारे में भी पढ़ा है, और की-वैल्यू स्टोर दिलचस्प लगते हैं।" यह एक समस्या की तलाश में समाधान की सभी बानगी है।
जेसनबिरच

NoSQL एक समस्या को हल नहीं करता है, लेकिन यह एक समस्या है जो व्यावहारिक रूप से किसी के पास नहीं है क्योंकि वे बड़े पैमाने पर पर्याप्त काम नहीं कर रहे हैं। दुर्भाग्य से यह सोचकर हमेशा अच्छा लगता है कि हमारे अपने सिस्टम चीजों की भव्य योजना में बड़े हैं जितना वे वास्तव में हैं। :)
जेम्सरैन

4

यदि आप लेट / लॉन्ग वैल्यू का उपयोग कर रहे हैं, तो आप अपने स्टोर के मूल्य भाग के रूप में जियोशॉट्स का उपयोग करने में सक्षम हो सकते हैं।

यहाँ NYC के लिए एक है। dr5regy6rc6ye

भूओश के साथ, आप अलग-अलग परिशुद्धता का एक ग्रिड प्राप्त करने के लिए भूओश के अंत में पात्रों को मारना शुरू कर सकते हैं: http://geohash.org/dr5re

उदाहरण js कार्यान्वयन: http://github.com/davetroy/geohash-js


1

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

मेरी सलाह इस बात का बारीकी से मूल्यांकन करने की होगी कि क्या आपके स्केल को वास्तव में NoSQL की आवश्यकता है, इस पर विचार करने से पहले कि इसका उपयोग कैसे करें।


1
यहां एक समस्या का एक उदाहरण है, जो आपके पास (और इसका एक समाधान) हो सकता है यदि आपको गणना करने की आवश्यकता है कि कोई बिंदु ज्यामिति के अंदर या बाहर है या नहीं। code.google.com/p/giscloud/wiki/SerializedSpatialIndexes
जॉन बर्नहर्स्ट

अरे @Jon, कि एक उत्तर के रूप में बेहतर जोड़ा जाएगा। इस तरह यह अपने दम पर खड़ा हो सकता है, और आपको इसका श्रेय मिलेगा यदि लोगों को लगता है कि इसमें योग्यता है!
जेसनबिरच


1

MongoDB में सख्त 2d [x, y] दस्तावेज़ों के गुण के आधार पर भू-स्थानिक सूचकांक बनाने और उपभोग करने की सुविधा है , और दोनों 'पास' और 'सीमा' प्रकार के प्रश्नों की अनुमति देता है। हालांकि यह अनुमानों के लिए किसी भी सुधार को संभालता नहीं है और एक सपाट धरती के एक आदर्श मॉडल का उपयोग करता है


0

मैं केवल कैशिंग लेयर के रूप में कुंजी / मान स्टोर का उपयोग करूंगा, http://www.membase.org/ या http://wiki.basho.com/display/RIAK/How+Things+Work (riak_kv_cache_backend) देखें

आपकी एप्लिकेशन आवश्यकताओं के आधार पर, आप अभी भी डेटा तक एसक्यूएल का उपयोग कर सकते हैं।


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