2010-04-14 16 views
10

डेटा के बड़े वॉल्यूम को आयात करना CSV (3 मिलियन + पंक्तियों) से डेटाबेस में बड़ी मात्रा में डेटा लोड करने का सबसे प्रभावी तरीका क्या है।सी # सीएसवी से डाटाबेस

  • डेटा प्रारूप तैयार किया जाता करने के लिए (जैसे नाम स्तंभ, प्रथम नाम और अंतिम नाम में अलग अलग किए जाने की आवश्यकता आदि)
  • मैं संभव यानी समय की कमी के रूप में एक कुशलता में ऐसा करने की जरूरत की जरूरत है

मैं सी # अनुप्रयोग पंक्ति-दर-पंक्ति का उपयोग कर डेटा पढ़ने, बदलने और लोड करने के विकल्प के साथ साइडिंग कर रहा हूं? क्या यह आदर्श है, यदि नहीं, तो मेरे विकल्प क्या हैं? क्या मुझे मल्टीथ्रेडिंग का उपयोग करना चाहिए?

+0

समय बाधा कितनी सख्त है? – Jake

उत्तर

4

आप I/O बाध्य होंगे, इसलिए बहुप्रचार आवश्यक रूप से इसे किसी भी तेज़ी से चलाने के लिए आवश्यक नहीं होगा।

पिछली बार मैंने यह किया, यह सी # की लगभग दर्जन रेखाएं थीं। एक धागे में यह हार्ड डिस्क जितनी तेजी से दौड़ता था क्योंकि यह प्लेटर्स से डेटा पढ़ सकता था। मैंने स्रोत फ़ाइल से एक समय में एक पंक्ति पढ़ी।

यदि आप इसे स्वयं लिखने के इच्छुक नहीं हैं, तो आप FileHelpers लाइब्रेरीज़ को आजमा सकते हैं। आप Sébastien Lorion's work पर भी एक नज़र रखना चाहते हैं। उनके सीएसवी पाठक विशेष रूप से प्रदर्शन मुद्दों से निपटने के लिए लिखे गए हैं।

+0

हां, सी # आईओ लाइब्रेरी अच्छी तरह से बफर के साथ बनाई गई है। हाल ही में मुझे एक मिनट की तरह कुछ सीएसवी से दूसरे (1.5 मीटर लाइनों) में बदलना पड़ा। –

+1

मैं भी फाइलहेल्पर की सलाह देता हूं। यह मुझे उन मूल्यों से निपटने के लिए एक पार्सर लिखने से बचाता है जिनमें अल्पविराम है। यदि सीएसवी में ऐसा कोई बुरा विवरण है, तो फाइलहेल्पर पर विचार करें। –

+0

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

2

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

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

1

आप यह नहीं बताते कि आप किस डेटाबेस का उपयोग कर रहे हैं, लेकिन जिस भाषा का आप उल्लेख करते हैं वह है सी # मैं SQL सर्वर मानने जा रहा हूं।

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

+0

मैं इस पर ग्रेग और जयरिग्स के साथ हूं। सी # छोड़ें (जब तक कि आप SQL सर्वर के लिए सीएलआर मॉड्यूल नहीं लिख रहे हों)। एसक्यूएल काम करते हैं। यदि आपने सुना नहीं है, तो फाइलों से डेटा के बड़े पैमाने पर वॉल्यूम के साथ काम करना अच्छा होता है। ;) यह आपको कॉन्सन आदि खोलने पर सभी प्रकार के सिरदर्द बचाएगा। – jcolebrand

+0

यह यूनिट परीक्षण के लिए बहुत मुश्किल बनाता है? – guazz

+0

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

3

आप CSV को तुरंत पढ़ने के लिए csvreader का उपयोग कर सकते हैं।

मान लें कि आप SQL सर्वर का उपयोग कर रहे हैं, तो आप डेटा सर्वर में डेटा पढ़ने के लिए csvreader के CachedCsvReader का उपयोग करते हैं जिसे आप SQL सर्वर में लोड करने के लिए SqlBulkCopy के साथ उपयोग कर सकते हैं।

+0

मैं यही उपयोग करता हूं। मुझे csvreader पसंद है, यह एक सीमांकित फ़ाइल तक पहुंचने का एक बहुत ही सुविधाजनक तरीका है। SqlBulkCopy – galford13x

+0

+1 दुर्भाग्यवश, मुझे मौजूदा रिकॉर्ड अपडेट करने की आवश्यकता है और डेटा प्रतिदिन लोड किया जाएगा। – Kiril

0

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

0

सीएसवी फ़ाइल लाइन की सामग्री को स्मृति डेटाटेबल में लाइन में पढ़कर पढ़ें। डेटाटेबल जनसंख्या के रूप में आप डेटा का उपयोग कर सकते हैं (यानी: पहला नाम और अंतिम नाम विभाजित करें) आदि।

एक बार जब CSV डेटा स्मृति में लोड हो गया है तो डेटाबेस को डेटा भेजने के लिए SqlBulkCopy का उपयोग करें।

प्रलेखन के लिए http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.writetoserver.aspx देखें।

0

तुम सच में सी # में कर, & एक DataTable पॉप्युलेट बनाने के लिए, काट-छांट लक्ष्य db तालिका चाहते हैं, तो System.Data.SqlClient.SqlBulkCopy.WriteToServer (DataTable डीटी) का उपयोग करें।

+0

के लिए – guazz

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