दिलचस्प पोस्ट
सी फंक्शन कॉस्ट बहुआयामी-सरणी तर्क अजीब चेतावनी वसंत MVC परीक्षण के साथ "परिपत्र व्यू पथ" अपवाद से कैसे बचें? एएसपी.नेट एमवीसी देखें इंजन तुलना क्या गूगल मैप्स पर एंड्रॉइड पर बारी-बारी से जीपीएस नेविगेशन ऐप बनाना संभव है? क्वेरी पर एंड्रॉइड जीपीएस गलत स्थान डेटा LIMIT ActiveDataProvider में काम नहीं कर रहा है यूटीएफ -8 पात्रों के साथ परेशानी; मैं जो देखता हूं वह नहीं है जो मैंने संग्रहीत किया है Excel 2010 में "फॉर्म कंट्रोल" और "एक्टिवक्स कंट्रोल" के बीच अंतर क्या है? tensorflow tf.nn.softmax और tf.nn.softmax_cross_entropy_with_logits के बीच का अंतर Angular2 validator जो कई फॉर्म फ़ील्ड्स पर निर्भर करता है किसी HTTP GET अनुरोध पर डेटा को क्यों संशोधित नहीं किया जाना चाहिए? सी # का उपयोग कर फ़ाइल से EXIF ​​डेटा कैसे प्राप्त करें आप pom.xml फ़ाइल में जावा कंपाइलर संस्करण कैसे निर्दिष्ट करते हैं? फायरबेज मूक अपन सूचना विखंडों में एक सूची पर पुनरावृत्त करने के लिए सबसे "अजगर" तरीका क्या है?

2 मिलियन पंक्तियों को SQL सर्वर में जल्दी से सम्मिलित करें

मुझे टेक्स्ट फ़ाइल से लगभग 2 मिलियन पंक्तियों को सम्मिलित करना होगा।

और डालने के साथ मुझे कुछ मास्टर तालिकाओं का निर्माण करना होगा।

एसक्यूएल सर्वर में ऐसे बड़े सेट डेटा को सम्मिलित करने का सर्वोत्तम और तेज़ तरीका क्या है?

Solutions Collecting From Web of "2 मिलियन पंक्तियों को SQL सर्वर में जल्दी से सम्मिलित करें"

आप SqlBulkCopy वर्ग के साथ कोशिश कर सकते हैं।

आपको किसी अन्य स्रोत से डेटा के साथ एक SQL सर्वर तालिका कुशलतापूर्वक थोक लोड कर देता है।

आप इसे कैसे उपयोग कर सकते हैं इसके बारे में एक शांत ब्लॉग पोस्ट है

  1. मुझे लगता है कि इससे बेहतर है कि आप डेटासेट का टेक्स्ट फ़ाइल का डेटा पढ़ते हैं

  2. SqlBulkCopy से बाहर निकलें – SQL # में से बल्क प्रविष्ट करें

    // connect to SQL using (SqlConnection connection = new SqlConnection(connString)) { // make sure to enable triggers // more on triggers in next post SqlBulkCopy bulkCopy = new SqlBulkCopy ( connection, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.UseInternalTransaction, null ); // set the destination table name bulkCopy.DestinationTableName = this.tableName; connection.Open(); // write the data in the "dataTable" bulkCopy.WriteToServer(dataTable); connection.Close(); } // reset this.dataTable.Clear(); 

या

शीर्ष पर चरण 1 करने के बाद

  1. डेटासेट से XML बनाएँ
  2. डाटाबेस में एक्सएमएल पास करें और बल्क डाट करें

आप विस्तार के लिए इस लेख की जांच कर सकते हैं: सी # डेटाटाबल और एसक्यूएल सर्वर ओपनएक्सएमएल फ़ंक्शन का उपयोग कर डेटा के थोक प्रविष्टि

लेकिन इसका परीक्षण 2 मिलियन रिकॉर्ड के साथ नहीं होगा, लेकिन यह मशीन पर स्मृति का उपभोग करेगा क्योंकि आपको 2 मिलियन रिकॉर्ड लोड करना होगा और इसे डालें।

SqlBulkCopy के समाधान के लिए पुनः:

मैंने पाठ फ़ाइल को कनवर्ट और प्रोसेस करने के लिए StreamReader का उपयोग किया था। नतीजा मेरे ऑब्जेक्ट की एक सूची थी।

मैंने एक CommitBatchSize या एक List<T> और एक बफर आकार ( CommitBatchSize ) CommitBatchSize । यह एक एक्सटेंशन (द्वितीय श्रेणी में) का उपयोग करके सूची को डेटा तालिका में बदल देगा।

यह बहुत तेज़ काम करता है मेरे पीसी पर, मैं 10 सेकंड से भी कम समय में 10 मिलियन से अधिक जटिल रिकॉर्ड डालने में सक्षम हूं।

यहां वर्ग है:

 using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DAL { public class BulkUploadToSql<T> { public IList<T> InternalStore { get; set; } public string TableName { get; set; } public int CommitBatchSize { get; set; }=1000; public string ConnectionString { get; set; } public void Commit() { if (InternalStore.Count>0) { DataTable dt; int numberOfPages = (InternalStore.Count / CommitBatchSize) + (InternalStore.Count % CommitBatchSize == 0 ? 0 : 1); for (int pageIndex = 0; pageIndex < numberOfPages; pageIndex++) { dt= InternalStore.Skip(pageIndex * CommitBatchSize).Take(CommitBatchSize).ToDataTable(); BulkInsert(dt); } } } public void BulkInsert(DataTable dt) { using (SqlConnection connection = new SqlConnection(ConnectionString)) { // make sure to enable triggers // more on triggers in next post SqlBulkCopy bulkCopy = new SqlBulkCopy ( connection, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.UseInternalTransaction, null ); // set the destination table name bulkCopy.DestinationTableName = TableName; connection.Open(); // write the data in the "dataTable" bulkCopy.WriteToServer(dt); connection.Close(); } // reset //this.dataTable.Clear(); } } public static class BulkUploadToSqlHelper { public static DataTable ToDataTable<T>(this IEnumerable<T> data) { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); DataTable table = new DataTable(); foreach (PropertyDescriptor prop in properties) table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); foreach (T item in data) { DataRow row = table.NewRow(); foreach (PropertyDescriptor prop in properties) row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; table.Rows.Add(row); } return table; } } 

}

यहां एक उदाहरण है जब मैं अपनी कस्टम ऑब्जेक्ट List<PuckDetection> ( ListDetections ) की एक सूची सम्मिलित करना चाहता हूं:

 var objBulk = new BulkUploadToSql<PuckDetection>() { InternalStore = ListDetections, TableName= "PuckDetections", CommitBatchSize=1000, ConnectionString="ENTER YOU CONNECTION STRING" }; objBulk.Commit(); 

BulkInsert वर्ग को कॉलम मानचित्रण जोड़ने के लिए संशोधित किया जा सकता है यदि आवश्यक हो। उदाहरण में आपके पास पहली कॉलम के रूप में एक पहचान की कुंजी है। (यह मानते हुए कि डाटालेबल में स्तंभ नाम डेटाबेस के समान हैं)

 //ADD COLUMN MAPPING foreach (DataColumn col in dt.Columns) { bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName); } 

मैं इस परिदृश्य में हाल ही में (7 मिलियन से अधिक पंक्तियों) में भाग लिया और एक बार में 5000 के सेगमेंट में एसक्यूएल एकमुश्त नौकरी में 7 मिलियन लाइनों को संभाला नहीं जा सकता (सिक्वल डालने के वक्त में कच्चे डेटा को पार्स करने के बाद) या उस बात के लिए 500,000 लाइनें जब तक कि इसे छोटे 5 के टुकड़ों में विभाजित नहीं किया जाता है। तब आप प्रत्येक 5 के स्क्रिप्ट को दूसरे के बाद एक चला सकते हैं।) के रूप में मुझे एसक्यूएल सर्वर 2012 एंटरप्राइज़ में नए अनुक्रम कमान का लाभ उठाने की जरूरत थी। मुझे सीक्वेंस कमांड के साथ डेटा की सात लाख पंक्तियाँ जल्दी और कुशलता से सम्मिलित करने का कोई प्रोग्रामैटिक तरीका नहीं मिल सका।

दूसरे, एक बैठक में एक मिलियन पंक्तियों या अधिक डेटा डालने के लिए चीजों में से एक यह है कि सम्मिलित प्रक्रिया के दौरान सीपीयू और मेमोरी खपत (अधिकतर मेमोरी) है। एसक्यूएल ने स्मृति / सीपीयू को इस परिमाण की नौकरी से खारिज कर दिया होगा, बिना जारी की गई प्रक्रियाओं यह कहने की ज़रूरत नहीं है कि आपके पास अपने सर्वर पर पर्याप्त प्रोसेसिंग पावर या मेमोरी नहीं है, तो आप इसे थोड़े समय में बहुत आसानी से क्रैश कर सकते हैं (जो मैंने कठिन तरीके से पाया)। यदि आप इस बिंदु तक पहुंचते हैं कि आपकी मेमोरी की खपत 70-75% से अधिक हो तो बस सर्वर रिबूट करें और प्रक्रियाओं को सामान्य में वापस जारी किया जाएगा।

मेरे परीक्षण के एक गुच्छा को चलाने के लिए मुझे यह देखने के लिए कि मेरे सर्वर की सीमाएं कितनी थी (सीमित सीपीयू / मेमोरी संसाधनों को काम करने के लिए दिया गया था), इससे पहले कि मैं वास्तव में एक अंतिम निष्पादन योजना हो सके। मैं यह सुझाव देता हूं कि आप इसे उत्पादन के क्षेत्र में रोल करने से पहले एक परीक्षण वातावरण में ऐसा करते हैं।

मैं बीसीपी उपयोगिता का उपयोग करता हूँ (थोक प्रतिलिपि कार्यक्रम) मैं हर महीने 1.5 मिलियन पाठ रिकॉर्ड लोड करता हूं। प्रत्येक पाठ रिकॉर्ड 800 अक्षर चौड़ा है। अपने सर्वर पर, 1.5 लाख पाठ रिकॉर्ड को SQL सर्वर तालिका में जोड़ने के लिए लगभग 30 सेकंड लगते हैं।

बीसीपी के लिए निर्देश http://msdn.microsoft.com/en-us/library/ms162802.aspx पर हैं