बाइनरी खोजें या BTREE सूचकांक अद्यतन मुद्दा

वोट
4

कल्पना कीजिए कि आप एक लेखक की ओर से एक नई किताब हर रोज दिया जाता है। पुस्तक पर कार्य चल रहा है। उन्होंने कहा कि आप नहीं बताता है कि वह क्या बदल गया है या जोड़ा गया है।

अपनी नौकरी परिवर्तन और परिवर्धन की पहचान, और केवल इन पारित प्रकाशक के साथ (जो पूरी किताब हर रोज पढ़ने के लिए समय नहीं है) करने के लिए है

इस समस्या के प्रयोजनों के लिए, पुस्तक ASCII पाठ और बढ़ती (वास्तव में एक MySQL बैकअप फ़ाइल) की 1m लाइनों के शामिल है।

मेरे वर्तमान विचार प्रत्येक पंक्ति (1k वर्ण) का एक सुरक्षित हैश (उदाहरण के लिए SHA256) बनाने के लिए और पर HD यह स्टोर करने के लिए है। चूंकि हैश केवल 32bytes है फ़ाइल केवल 32MB है।

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

जब प्रक्रिया समाप्त होने हम अगले दिन के लिए हैश फ़ाइल तैयार ऊपर लिख।

तुलना का उपयोग करता है तार का एक द्विआधारी खोज विधि की तुलना (> <ऑपरेंड) यह चार पुनरावृत्तियों के एक औसत में एक परिणाम देता है।

मैं अभी तक एक BTREE सूचकांक समाधान से कोड नहीं है, लेकिन आप यह कैसे से निपटने के हैं?

30/10/2008 को 01:52
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


6 जवाब

वोट
1

मैं का प्रयोग करेंगे diff

अगर मैं अपने खुद के कार्यक्रम के भीतर इसे लागू करने की जरूरत है, मैं खोजने के लिए एल्गोरिदम में से एक का प्रयोग करेंगे सबसे लंबे समय तक आम subsequence दो दृश्यों के प्रत्येक फ़ाइल लाइनों की एक अनुक्रम के रूप में इलाज।

30/10/2008 को 01:58
का स्रोत उपयोगकर्ता

वोट
0

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

कल के मूल्यों की 1m लाइनों के साथ तुलना में आज के हैश मान की 1m लाइनों: समझ गया।

लाइनों डाला जाता है या हटा दिया है? यदि नहीं, तो इस समानांतर का एक सरल सेट करता है, तो हैश अलग हैं देखने के लिए पढ़ता है।

तो देखते हैं कहते हैं या निष्कासन में, आप diff एल्गोरिथ्म का उपयोग करने के परिवर्तन का दायरा निर्धारित करना होगा।

सब ठीक है। भी लागू करना मुश्किल नहीं है।

इस संदर्भ में, निम्नलिखित कोई मतलब नहीं है।

तुलना का उपयोग करता है तार का एक द्विआधारी खोज विधि की तुलना (> <ऑपरेंड) यह चार पुनरावृत्तियों के एक औसत में एक परिणाम देता है।

वहाँ हैश मान को आदेश देने के कुछ प्रकार है? या कुछ वृक्ष संरचना?

30/10/2008 को 02:20
का स्रोत उपयोगकर्ता

वोट
0

1 लाख लाइनों की किताब बहुत बड़ा है: वहाँ शायद रहे हैं 30 - प्रति पृष्ठ 50 लाइनों, तो चलो उदार हो और प्रति पृष्ठ है, जो पुस्तक में 10,000 पृष्ठों का मतलब है 100 लाइनों मान।

1 KB की रेखाएँ भी बहुत बड़ा की तुलना में सामान्य है कर रहे हैं; बुनियादी पठनीयता कहीं नहीं प्रत्येक पंक्ति में है कि कई पात्रों के पास पता चलता है। आप के ऊपर 1 करने के लिए KB, या हिस्सा 1 KB मात्रा में फ़ाइल लाइनों हैश करने का इरादा है? अपनी योजना के साथ एक समस्या है कि किसी भी दोहराया लाइनों एक दोहराया हैश होता है; आप की पहचान नहीं कर सकता था जब उन पंक्तियों में से एक जोड़ा गया है या नष्ट कर दिया।

तुम्हें पता है, शायद, भी नष्ट कर दिया लाइनों के प्रकाशक को सूचित करने की आवश्यकता होगी।

Glomek साथ के रूप में, मैं प्रयोग करेंगे diffफ़ाइल पर। आप आरसीएस या सीवीएस नियंत्रण में फ़ाइल रखना, तो आप फ़ाइल का सिर्फ वर्तमान संस्करण और संग्रहीत पहले के संस्करण के बीच डिफ होगा। इस के साथ, आप एक सप्ताह या महीने भी साथ संचयी डिफ प्रदान करने में सक्षम हो जाएगा।

और मैं शायद अपने ही बी-ट्री अनुक्रमण का विकास नहीं होगा।

30/10/2008 को 02:23
का स्रोत उपयोगकर्ता

वोट
0

समाधान आपके द्वारा बताई गई कुछ हद तक rsync एल्गोरिथ्म के समान है। एक महत्वपूर्ण बात यह है rsync, लक्ष्य फ़ाइल में कहीं भी मौजूदा हिस्सा पहचान करने के लिए किसी भी मूल से ऑफसेट पर पड़ता है।

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

भी, आप reorderings पहचान करने के लिए क्या है? या केवल सम्मिलन / विलोपन / प्रतिस्थापन?

सबसे सामान्य मामला पूर्ण rsync एल्गोरिथ्म, जो इस प्रकार है है:

  • मापदंडों परिभाषा:

    1. एक ब्लॉक आकार 512 चुनते हैं, या 1k आमतौर पर ठीक काम करते हैं।
      • एक 'मजबूत' चेकसम चुनें। कुछ MD4 से या तो की तरह। 64bits बहुत सारे हैं।
      • एक 'कमजोर' रोलिंग चेकसम चुनें। एक है जो आपको 'घटाना' पूंछ बाइट और 'जोड़ें' एक सिर बाइट एक ब्लॉक 1-बाइट आगे की जांच योग प्राप्त करने के लिए। आम तौर पर एक 16-बिट चेकसम ठीक काम करता है।
  • पुरानी फाइल के हस्ताक्षर:

    1. पूरे पुरानी फाइल पार, प्रत्येक ब्लॉक में दोनों कमजोर और मजबूत चेकसम गणना। 16 और 64 बिट्स चेकसम, और 512byte ब्लॉक के साथ कि प्रति ब्लॉक 10bytes, या प्रति मेगाबाइट 20KB का मतलब है। इस 'हस्ताक्षर' है
  • नई फ़ाइल के साथ 'पैच', और पुरानी फाइल के हस्ताक्षर बनाने के लिए:

    1. पुरानी फाइल के हस्ताक्षर लोड करते हैं, सबसे अच्छा, एक हैश तालिका है कुंजी के रूप में कमजोर चेकसम के साथ, मजबूत चेकसम और ब्लॉक स्थिति मान हैं।
      • नई फ़ाइल की पहली ब्लॉक पढ़ा
      • भरी हुई ब्लॉक के कमजोर चेकसम गणना
      • हैश तालिका की जाँच करता है, तो कमजोर चेकसम है देखने के लिए।
      • अगर पाया, मजबूत checksum की गणना और हैश में पाया एक के साथ तुलना
      • अगर दोनों चेकसम से मेल खाते हैं, चिह्न के रूप में हैश में ब्लॉक संदर्भ के साथ 'यह मिल गया', एक पूरे ब्लॉकसाइज अग्रिम और चरण 3 पर वापस जाने के लिए
      • अगर मजबूत चेकसम से मेल नहीं खाती है, या यदि कमजोर चेकसम हैश, 'रोल' कमजोर चेकसम, कि है, अगले बाइट गुट के बाद 'जोड़ें', और 'घटाना' से पहले बाइट में नहीं था पूंछ।
      • पैच में 'नए' बाइट की सूची में बाइट पूंछ से 'substracted' जोड़ें
      • चरण 4 पर वापस जाने के लिए
  • पुरानी फाइल में पैच लागू

    1. 'पैच' 'नए' बाइट्स कि बंद गिरा चेकसम, प्लस की सूची रोलिंग जबकि की सूची है ब्लॉक पुरानी फाइल पर उस मैच 'यह मिल गया'।
30/10/2008 को 02:34
का स्रोत उपयोगकर्ता

वोट
0

इस के लिए इस्तेमाल किया एक तकनीक है वृद्धिशील लोड हो रहा है एक डेटा गोदाम पर। स्थिति है जहाँ आप एक स्रोत प्रणाली के भीतर बदल डेटा की पहचान करने की क्षमता नहीं है में, आप डेटा का एक स्नैपशॉट ले और अंतर की पहचान करने के लिए अपने पिछले स्नैपशॉट के साथ तुलना कर सकते हैं। इस तकनीक को भी में उल्लेख हो जाता है इस विषय पर राल्फ Kimball की किताब और में प्रयोग किया जाता है एक आवेदन मैं के डिजाइन में शामिल किया गया था।

आप की जरूरत है इस दृष्टिकोण के रूप में एक बहुत व्यापक कुंजी के साथ एक हैशिंग एल्गोरिथ्म के लिए असुरक्षित है जन्मदिन हमलों । MD5 या SHA परिवार के किसी भी अच्छा होगा। यह भी एक के बाद प्रक्रिया है कि अंतर प्राकृतिक कुंजियां अनुपलब्ध की तलाश माध्यम से चला जाता बिना विलोपन का पता नहीं लगा सकते हैं। यह गणना वास्तव में तालिका संरचना के बारे में पता होना चाहिए।

30/10/2008 को 09:44
का स्रोत उपयोगकर्ता

वोट
0

अपनी योजना के साथ एक समस्या है कि किसी भी दोहराया लाइनों एक दोहराया हैश होता है; आप की पहचान नहीं कर सकता था जब उन पंक्तियों में से एक जोड़ा गया है या नष्ट कर दिया

बहुत अच्छा बिंदु है, लेकिन नहीं एक मुद्दा। एक दोहराया लाइन डुप्लिकेट है और सभी डुप्लिकेट प्रसंस्करण के अगले चरण में नष्ट हो जाती हैं। तो हाँ तुम ठीक कह रहे हैं, लेकिन यह कोई मुद्दा नहीं है।

"Diff" लिंक मुझे मैं क्या मान एक आवेदन है के विवरण के साथ एक पृष्ठ पर ले जाता? कोई डाउनलोड लिंक वहाँ किसी भी भाषा में कोई कोड है, नहीं है ... मैं यहाँ क्या याद आ रही है?

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

तो हम लगभग 1000 वर्ण (कोई बाइनरी), दो फ़ाइलें (आज स्नैपशॉट और कल स्नैपशॉट) कि प्रत्येक लगभग 1m लाइनें हैं में की तर्ज तुलना कर रहे हैं।

तो (MD5 टकराव है और तुलनात्मक रूप से धीमी है) SHA256 की तरह एक सुरक्षित हैश मैं बारे में मेरी ओ लैपटॉप पर 30MB / सेकंड संसाधित कर सकते हैं का उपयोग कर। निश्चित रूप से सर्वर एक बहुत तेज़ी से चबाना होगा।

तो अगर फ़ाइल arond 1GB है, तो सभी hases बनाने 33sec के बारे में लेता है, और खिड़कियों पेज स्मृति का उपयोग 1Gb फ़ाइल को पढ़ने 30sec के बारे में लेता है। भीषण नहीं

अब हम प्रत्येक फ़ाइल की पंक्तियों का प्रतिनिधित्व hashs के दो सरणियों की है। अगर हम उन्हें सॉर्ट, अब हम एक द्विआधारी खोज का उपयोग कर सकते हैं, इसलिए हम पुरानी फ़ाइलों hashs में एक मैच के लिए देख नई फ़ाइलें hashs के माध्यम से हमारे रास्ते पुनरावृति। हम न यह मिल जाए, कि लाइन परिवर्तन फाइल करने के लिए जोड़ा गया है।

ध्यान रखें कि लाइनों की पुस्तक (विरासत डेटाबेस) हर पहलू में अज्ञात है। वहाँ लाइनों, परिवर्तन के स्थान, परिवर्तन के प्रकार के आदेश की कोई गारंटी नहीं है।

पेज से foreward पेज पढ़ने का सुझाव अच्छा है, लेकिन यह मानता है कि दो फ़ाइलों पहला परिवर्तन तक ऊपर smae क्रम में हैं। यह नहीं माना जा सकता। लाइनों (पंक्तियाँ) किसी भी क्रम में हो सकता है। इसके अलावा एक मनमाना ब्लॉकसाइज का उल्लंघन एक पंक्ति का विवरण के स्तर को चुनने। इस कार्य के प्रयोजनों के लिए, लाइनों अपरिवर्तनीय हैं।

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

यह यहां सबसे अधिक प्रासंगिक है: हम टेराबाइट डेटा गोदामों के क्षेत्र में आगे बढ़ने के रूप में, एक रात के आधार पर खरोंच से डेटा गोदाम के पुनर्निर्माण करने की क्षमता डायनासोर के मदद मिलेगी। डेटा गोदाम को अद्यतन करने के लिए तार्किक और कुशल दृष्टिकोण वृद्धिशील अद्यतन रणनीति के कुछ फार्म शामिल है।

तो मुझे लगता है मैं सही रास्ते पर फिर रहा हूँ? एक BTREE सूचकांक एक फायदा बर्दाश्त नहीं करेंगे?

31/10/2008 को 08:47
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more