2011-09-06 8 views
6

मेरे पास XML प्रारूप में लाखों रिकॉर्ड के साथ large datasets है। ये डेटासेट समय के एक निश्चित बिंदु तक डेटाबेस के पूर्ण डेटा डंप हैं।मैं दो बड़े डेटासेट के बीच अंतर कैसे निर्धारित कर सकता हूं?

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

इनमें से दो डेटासेट (हटाने और अपडेट सहित) के बीच डेल्टा निर्धारित करने का सबसे अच्छा तरीका क्या होगा?


मेरी योजना आरडीबीएमएस में सबकुछ लोड करना और वहां से जाना है।

सबसे पहले, पुराने डंप को लोड करें। फिर, नए डंप को एक अलग स्कीमा में लोड करें, लेकिन ऐसा करने में मैं जांच करूंगा कि प्रविष्टि नई है या मौजूदा प्रविष्टि का अपडेट है या नहीं। यदि हां, तो मैं "परिवर्तन" नामक एक नई तालिका (आईडी) पर आईडी लॉग करूंगा।

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

आईडी द्वारा रिकॉर्ड देखने का मानना ​​O(log n) ऑपरेशन है, इससे मुझे O(n log n) समय में सब कुछ करने की अनुमति देनी चाहिए।

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

सुझाव? (नोट: यह किसी भी चीज़ से प्रदर्शन प्रश्न अधिक है)

+0

"क्योंकि मैं निर्धारित कर सकते हैं ... जो इस तेजी से परिमाण के आदेश से बनाना चाहिए"। "यह किसी भी चीज़ से प्रदर्शन प्रश्न से अधिक है"। ...स्मृति में यह करने से बहुत तेज़ हो जाएगा, और आप मुख्य रूप से प्रदर्शन से चिंतित हैं। लगता है जैसे आपने अपने प्रश्न का उत्तर दिया। – Gerrat

उत्तर

0

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

+0

गिट हैंडल कर सकते हैं कि यदि रिकॉर्ड किसी विशेष क्रम में नहीं हैं (यानी: आदेश को रहने के लिए गारंटी नहीं है)? – NullUserException

+0

@NullUserException: गिट फ़ाइल संरचनाओं पर काम करता है। यदि आप स्टैक ओवरफ़्लो निर्यात के बारे में बात कर रहे हैं, तो आप प्रत्येक प्रश्न XML को फ़ाइल प्रश्id.xml में संग्रहीत कर सकते हैं (सुनिश्चित नहीं है, निर्यात को विस्तार से कभी नहीं देखा।) – Andomar

+0

सभी प्रश्न एक ही XML फ़ाइल में हैं ... I वास्तव में लाखों एक्सएमएल फाइलें बनाने से बचना चाहते हैं ... – NullUserException

0

एमएसडीएन पर इस पोस्ट को देखें, जो दो डेटाटेबल्स के बीच अंतर प्राप्त करने के लिए एक समाधान प्रदान करता है। यह सही दिशा में ले जाना चाहिए:

दो DataTables तुलना करने के लिए कैसे:
http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/23703a85-20c7-4759-806a-fabf4e9f5be6

आप भी इस पर एक नज़र लेने के लिए इतना भी सवाल चाह सकते हैं:
Compare two DataTables to determine rows in one but not the other

मैंने यह भी देखा इस दृष्टिकोण कई बार प्रयोग किया है:

table1.Merge(table2); 
DataTable changesTable = table1.GetChanges(); 
0
select 
    coalesce(a.id, b.id) as id, 
    case 
     when a.id is null then 'included' 
     when b.id is null then 'deleted' 
     when a.col != b.col then 'updated' 
    end as status 
from a 
full outer join b on a.id = b.id 
where a.id is null or b.id is null or a.col != b.col 
+0

मुझे पता है कि यह कैसे करना है, मैं इस तरह की क्वेरी के प्रदर्शन के बारे में अधिक चिंतित हूं। – NullUserException

+0

@ नल शीर्षक यह पूछता है कि अंतर को कैसे निर्धारित किया जाए, यह कैसे नहीं किया जाए। ऐसा लगता है कि आप एक लूप बनाना चाहते हैं और यह बुरा होगा। –

+0

आप कैसे सुझाव देते हैं कि मैं लूप के बिना डेटा लोड करता हूं? – NullUserException

1

डेल्टाएक्सएमएल देखें।

(गद्देदार क्योंकि StackOverflow कम जवाब की अनुमति नहीं है)

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