पोस्टग्रेज में फास्ट हैमिंग डिस्टेंस क्वेश्चन


15

मेरे पास एक बड़ा डेटाबेस (16M पंक्तियाँ) हैं जिनमें छवियों के अवधारणात्मक हैश हैं।

मैं उचित समयावधि में दूरी तय करके पंक्तियों की खोज करने में सक्षम होना चाहता हूं ।

वर्तमान में, जहां तक ​​मैं इस मुद्दे को ठीक से समझता हूं, मुझे लगता है कि यहां सबसे अच्छा विकल्प एक कस्टम SP-GiST कार्यान्वयन होगा जो बीके-ट्री को लागू करता है , लेकिन यह बहुत काम की तरह लगता है, और मैं अभी भी व्यावहारिक पर फजी हूं एक कस्टम सूचकांक को ठीक से लागू करने का विवरण। आलोचनात्मक दूरी गिना जा रहा है विनयशील पर्याप्त है, और मैं कर हालांकि पता सी,।

मूल रूप से, यहां उपयुक्त दृष्टिकोण क्या है ? मुझे हैश के एक निश्चित संपादन-दूरी के भीतर मैचों के लिए क्वेरी करने में सक्षम होने की आवश्यकता है। जैसा कि मैं इसे समझता हूं, समान लंबाई के तारों के साथ लेवेंसहाइट दूरी कार्यात्मक रूप से बाधा उत्पन्न करने वाली दूरी है, इसलिए मैं जो चाहता हूं उसके लिए कम से कम कुछ मौजूदा समर्थन है, हालांकि इससे कोई सूचकांक बनाने का कोई स्पष्ट तरीका नहीं है (याद रखें, जिस मूल्य के लिए मैं क्वेरी कर रहा हूं। परिवर्तन। मैं एक निश्चित मूल्य से दूरी की पूर्व-गणना नहीं कर सकता, क्योंकि यह केवल उस एक मूल्य के लिए उपयोगी होगा)।

वर्तमान में हैश के बाइनरी ASCII एन्कोडिंग (उदाहरण के लिए "10010101 ...") वाले हैश को 64-चार स्ट्रिंग के रूप में संग्रहीत किया जाता है, लेकिन मैं उन्हें आसानी से पर्याप्त रूप से int64 में बदल सकता हूं। असली मुद्दा यह है कि मुझे अपेक्षाकृत तेजी से क्वेरी करने में सक्षम होना चाहिए।

ऐसा लगता है कि मैं जो चाहता हूं, उसकी तर्ज पर कुछ हासिल करना संभव हो सकता है pg_trgm, लेकिन मैं इस बात पर थोड़ा अस्पष्ट हूं कि ट्रिग्राम मिलान मेचैज्म कैसे काम करता है (विशेष रूप से, यह जो समानता मीट्रिक लौटाता है वह वास्तव में प्रतिनिधित्व करता है? यह क्या है? एडिट-डिस्टेंस की तरह)।

सम्मिलित प्रदर्शन महत्वपूर्ण नहीं है (यह प्रत्येक पंक्ति के लिए हैश की गणना करने के लिए बहुत कम्प्यूटेशनल रूप से महंगा है), इसलिए मैं मुख्य रूप से खोज के बारे में परवाह करता हूं।


Smlar के विस्तार में आपकी क्या आवश्यकता हो सकती है: pgcon.org/2012/schedule/attachments/252_smlar-2012.pdf या pg_similarity: pgcon.org/2009/schedule/attachor/108_pg_similarity.pdf
नील

@NeilMcGuigan - दिलचस्प! पहली प्रस्तुति वास्तव में उन लोगों से है जो पोस्टग्रेज में एसपी-जीएसटी और जीआईएसटी सिस्टम बनाए रखते हैं।
नकली नाम

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

FWIW, इस बिंदु पर, मैंने कम या ज्यादा निष्कर्ष निकाला है कि मुझे अपनी खुद की अनुक्रमण प्रणाली को लागू करने की आवश्यकता है। मैं इस समय कस्टम SP-GiST सूचकांकों में देख रहा हूं, लेकिन मुझे नहीं पता कि मैं क्या कर रहा हूं।
नकली नाम

1
@ फ़ेकनाम: जब आप हामिंग दूरी कहते हैं, तो मैं मान रहा हूँ कि हैश मानों की हैमिंग दूरी स्ट्रिंग्स है, न कि चित्र? दूसरे शब्दों में, आप पूछना चाहते हैं: सभी हैश मानों को खोजें जो इनपुट पैरामीटर से दूर एक्स बिट प्रतिस्थापन हैं
थॉमस केजर

जवाबों:


11

खैर, मैंने कुछ समय के लिए एक कस्टम पोस्टग्रेज सी एक्सटेंशन लिखने पर विचार किया, और एक साइथॉन डेटाबेस रैपर को लिखते हुए घाव किया जो स्मृति में बीके-ट्री संरचना को बनाए रखता है।

मूल रूप से, यह डेटाबेस से चरण मानों की एक-इन-मेमोरी प्रतिलिपि रखता है, और डेटाबेस के सभी अपडेट बीके-ट्री में फिर से दोहराए जाते हैं।

यह सब यहाँ github पर है । इसमें बहुत सारे यूनिट-टेस्ट भी होते हैं।

पेड़ में मूल्यों के 0.25% -0.5% को छूने में 4 परिणामों की दूरी के साथ 10 मिलियन हैश मूल्यों के डेटासेट में क्वेरी करना, और ~ 100 एमएस लेता है।


बीके-ट्री मेमोरी में 16 मिलियन पंक्तियों के साथ स्मृति में? हालाँकि मैं कुछ इसी तरह की चीज़ों को देख रहा था, 1000 और 2000 वर्णनकर्ताओं के साथ प्रत्येक छवि पर मेरी मेमोरी का आकार बहुत बड़ा था।
स्टीवर्ट

@ स्टीवर्ट - इसमें से बहुत कुछ आपके हैश के आकार पर निर्भर करता है। मेरे मामले में, हैश मूल्य आउटपुट एक एकल 64-बिट बिटफील्ड है जिसे मैं एक इंट 64 के रूप में संग्रहीत करता हूं। लगता है कि आपके पास बहुत बड़ा phash डेटा प्रकार है। मुझे यह भी पता नहीं है कि इस तरह की खोज एक अलग डेटाटाइप पर कैसे काम करेगी। क्या वे अभी भी एक मीट्रिक स्थान हैं? आप दूरी की गणना कैसे करते हैं?
नकली नाम

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

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

7

मोर्स एंकर्स!

ठीक है, मैंने आखिरकार एक कस्टम PostgreSQL इंडेक्सिंग एक्सटेंशन लिखने का समय लिया है। मैंने SP-GiST इंटरफ़ेस का उपयोग किया ।

यह काफी चुनौतीपूर्ण था, ज्यादातर क्योंकि पॉज़्र्स बड़ा है

वैसे भी, हमेशा की तरह, यह यहाँ github पर है

प्रदर्शन के लिहाज से, यह वर्तमान में ~ 2-3 गुना धीमा है तो इस सवाल के मेरे अन्य उत्तर में शुद्ध-इन-मेमोरी कार्यान्वयन है, लेकिन यह उपयोग करने के लिए बहुत अधिक सुविधाजनक है मैं खुशी से उस प्रदर्शन को खाऊंगा (वास्तविक रूप से, यह ~ 50 है एमएस / क्वेरी - 150 एमएस / क्वेरी, जो अभी भी बहुत छोटा है)।


आप कमाल के है! क्या आप कैसे स्थापित करने पर एक README जोड़ सकते हैं? मैंने कभी भी पोस्टग्रेज में कुछ भी स्थापित नहीं किया: पी
हाइपवुल्फ

1
@HypeWolf - रेपो की जड़ में एक README है । क्या वह नहीं है जो आप चाहते हैं?
नकली नाम

मेरी गलती, मैंने इसे नहीं देखा, मुझे यकीन नहीं है कि मैं कहाँ देख रहा था: /
HypeWolf

साथ ही README की तलाश कर रहा था। यह रूट फोल्डर में है। लिंक कुछ सबफ़ोल्डर में जा रहा है। वह भ्रामक था।
20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.