2010-07-19 65 views
5

ठीक है बदल गया है, इसलिए कहानी इस तरह है:का पता लगाने जब डेटा

- मैं फ़ाइलों के बहुत सारे (बहुत बड़ी, 25GB के आसपास) है कि एक विशेष प्रारूप में हैं हो रहा है और एक डेटासंग्रह में आयात किया जा करने की जरूरत है

- इन फ़ाइलों को लगातार डेटा, कभी कभी नए, कभी कभी एक ही डेटा

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

अद्यतन करने में व्यतीत समय को कम करने के लिए

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

- फ़ाइलें हैं तार और संख्या (शीर्षक, आदेश, कीमतों आदि)

केवल समाधान मैं के बारे में सोच सकता है:

- डेटाबेस से प्रत्येक पंक्ति के लिए एक हैश की गणना, कि यह फ़ाइल से पंक्ति के हैश के खिलाफ तुलना की जाती है और यदि वे अलग हैं डेटाबेस

- फ़ाइलों की 2 प्रतियां, पिछले और वर्तमान वाले को रखें और उस पर भिन्नताएं बनाएं (जो शायद डीबी अद्यतन करने से तेज़ हैं) और उन पर आधारित डीबी अद्यतन।

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

कोई सलाह, सराहना की जाएगी।

उत्तर

1

मांग पर डेटाबेस से प्रत्येक पंक्ति के लिए हैश की गणना करने के बजाय, आप इसके बजाय हैश मान क्यों संग्रहीत नहीं करते हैं?

फिर आप फ़ाइल के हैश मान की गणना कर सकते हैं और डेटाबेस संग्रहित लोगों के खिलाफ इसकी तुलना कर सकते हैं।

अद्यतन:

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

+0

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

+0

+1 अंतिम संशोधित दिनांक और समय को स्टोर करने का सुझाव देने के लिए –

+0

मेरे पास उस फ़ाइल में कोई टाइमस्टैम्प नहीं है। – hyperboreean

1

भले ही आप अपने सबसे बुरे मामले का उपयोग करते हैं, ओ (एन) होने वाला है, जो एन ~ 25 जीबी डेटा पर इतना सुंदर नहीं है।

जब तक आप फ़ाइलों को लिखने वाली प्रक्रिया को संशोधित नहीं कर सकते।

चूंकि आप हर समय 25 जीबी अपडेट नहीं कर रहे हैं, यह चक्र बचाने के लिए आपकी सबसे बड़ी संभावना है।

1. बेतरतीब ढंग से
क्यों आप इस प्रक्रिया को लिखते हैं कि डेटा केवल संलग्न नहीं बनाते हैं नहीं लिखते? इस तरह आपके पास अधिक डेटा होगा, लेकिन आपके पास पूरा इतिहास होगा और आप ट्रैक कर सकते हैं कि आपने पहले से किस डेटा को संसाधित किया है (जिसे आपने पहले से ही डेटास्टोर में रखा है)।

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

इसके अलावा आप बदले गए ब्लॉक/लाइनों के चेकसम/हैंश रख सकते हैं। हालांकि यह बहुत दिलचस्प नहीं हो सकता है - यह गणना करने के लिए इतना सस्ता नहीं है और प्रत्यक्ष तुलना सस्ता हो सकती है (यदि आपके पास लिखने के दौरान मुफ्त CPU चक्र हैं तो यह आपको बाद में कुछ पढ़ने का समय बचा सकता है, वाईएमएमवी)।

नोट (रों) यदि आप प्रक्रिया है कि डिस्क

  • में डेटा लिखता है करने के लिए समायोजन कर सकते हैं

    • दोनों # 1 और # 2 केवल दिलचस्प हैं आप इस प्रक्रिया को संशोधित नहीं कर सकते हैं जो 25 जीबी डेटा में लिखता है तो मुझे नहीं लगता कि चेकसम/हैश कैसे मदद कर सकते हैं - आपको हैश की गणना करने के लिए वैसे भी सभी डेटा पढ़ना होगा (क्योंकि आप नहीं जानते कि क्या बदल गया है) ताकि आप पढ़ने के दौरान सीधे तुलना कर सकें और अद्यतन/जोड़ने (या अपडेट/सीधे जोड़ें)
    • भिन्न एल्गोरिदम का उपयोग करने के लिए पंक्तियों की एक सूची के साथ आओ उप-शीर्ष हो सकता है, diff एल्गोरिदम न केवल उन पंक्तियों को देखेगा जो बदले गए हैं, लेकिन कुछ स्वरूपण विकल्पों को देखते हुए दो टेक्स्ट फ़ाइलों के बीच न्यूनतम संपादन दूरी की जांच भी करेंगे। (diff में, इसे धीमे या तेज़ काम करने के लिए -एच या --minimal के साथ नियंत्रित किया जा सकता है, यानी सटीक न्यूनतम समाधान की खोज करें या हेरिस्टिक एल्गोरिदम का उपयोग करें जिसके लिए iirc यह एल्गोरिदम ओ (एन लॉग एन) बन जाता है; जो बुरा नहीं है, लेकिन फिर अभी भी धीमी हे (एन) जो आप के लिए उपलब्ध है अगर आप लाइन द्वारा प्रत्यक्ष तुलना लाइन करना)
  • 3

    समस्या परिभाषा समझ में आ के रूप में।

    मान लीजिए कि आप कहा गया है पंक्ति अद्यतन जोड़ा जा सकता है/अपनी फ़ाइल

    ID,Name,Age 
    1,Jim,20 
    2,Tim,30 
    3,Kim,40 
    

    भी है, इसलिए फ़ाइल

    ID,Name,Age 
    1,Jim,20 -- to be discarded 
    2,Tim,35 -- to be updated 
    3,Kim,40 -- to be discarded 
    4,Zim,30 -- to be inserted 
    

    अब आवश्यकता डालने/केवल अपडेट करके डेटाबेस को अद्यतन करने के लिए है हो जाता है दो एसक्यूएल प्रश्नों में 2 से अधिक रिकॉर्ड या दो बैक क्वेरी वाले दो बैच क्वेरी।

    मैं मान्यताओं यहाँ

    • आप फ़ाइलें बनाने के लिए मौजूदा प्रक्रिया को संशोधित नहीं कर सकते निम्नलिखित बनाने रहा हूँ।
    • आप डेटाबेस में डेटा अपलोड करने के लिए कुछ बैच प्रोसेसिंग का उपयोग कर रहे हैं [फाइल से पढ़ना - स्मृति में मेमोरी-लेखन में डीबी] ।

    स्टोर एक में स्मृति मानचित्र जहां आईडी कुंजी है और मूल्य हैश है [आप scalability उपयोग hazelcast की आवश्यकता होती है] में रिकार्ड [नाम, आयु] आईडी के खिलाफ हैश मान।

    डेटा लोड करने के लिए आपके बैच फ्रेमवर्क [फिर से मानते हुए फ़ाइल की एक पंक्ति को एक रिकॉर्ड के रूप में माना जाता है], इन-मेमोरी मैप में आईडी के खिलाफ गणना किए गए हैश मान को जांचने की आवश्यकता है। पहली बार निर्माण आपके बैच का उपयोग करके भी किया जा सकता है फ़ाइलों को पढ़ने के लिए ढांचा।

    If (ID present) 
    --- compare hash 
    ---found same then discard it 
    —found different create an update sql 
    In case ID not present in in-memory hash,create an insert sql and insert the hashvalue 
    

    आप समानांतर प्रसंस्करण, हिस्सा प्रसंस्करण के लिए जाने के लिए और हो सकता है वसंत बैच और hazelcast का उपयोग करने में स्मृति डेटा विभाजन।

    http://www.hazelcast.com/

    http://static.springframework.org/spring-batch/

    आशा इस मदद करता है।

    0

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

    कुछ ऐसा जो मैं समझ नहीं सकता: फाइलें वास्तव में टेक्स्ट फाइलें हैं जो अभी संलग्न नहीं हैं, लेकिन अपडेट की गई हैं? यह अत्यधिक अप्रभावी है (फाइलों की 2 प्रतियों को रखने के विचार के साथ, क्योंकि यह फाइल कैशिंग काम को और भी बदतर बना देगा)।

    संबंधित मुद्दे