क्योंकि मुझे लगता है कि खराब प्रदर्शन होगा, मैं डेटाटेबल को CSV फ़ाइल में लिखना नहीं चाहता हूं और MySQLBulkLoader क्लास के साथ वहां से सम्मिलित करना चाहता हूं।
निष्पक्ष धारणाओं के आधार पर संभावित समाधान को नकारें। मैंने System.Data.DataTable
से Transaction
के अंदर मानक MySqlDataAdapter#Update()
का उपयोग करके एक MySQL तालिका में 100,000 पंक्तियों के सम्मिलन का परीक्षण किया। यह लगातार चलाने के बारे में 30 सेकंड ले लिया:
using (MySqlTransaction tran = conn.BeginTransaction(System.Data.IsolationLevel.Serializable))
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.Connection = conn;
cmd.Transaction = tran;
cmd.CommandText = "SELECT * FROM testtable";
using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
{
da.UpdateBatchSize = 1000;
using (MySqlCommandBuilder cb = new MySqlCommandBuilder(da))
{
da.Update(rawData);
tran.Commit();
}
}
}
}
(मैं UpdateBatchSize
के लिए अलग मान के एक जोड़े की कोशिश की लेकिन वे बीता हुआ समय पर एक महत्वपूर्ण प्रभाव है लगता नहीं था।)
तक इसके विपरीत, MySqlBulkLoader
का उपयोग कर निम्नलिखित कोड (का उपयोग कर चलाने के लिए केवल 5 या 6 सेकंड ...
string tempCsvFileSpec = @"C:\Users\Gord\Desktop\dump.csv";
using (StreamWriter writer = new StreamWriter(tempCsvFileSpec))
{
Rfc4180Writer.WriteDataTable(rawData, writer, false);
}
var msbl = new MySqlBulkLoader(conn);
msbl.TableName = "testtable";
msbl.FileName = tempCsvFileSpec;
msbl.FieldTerminator = ",";
msbl.FieldQuotationCharacter = '"';
msbl.Load();
System.IO.File.Delete(tempCsvFileSpec);
... समय एक अस्थायी CSV फ़ाइल में DataTable से 100,000 पंक्तियों डंप करने के लिए सहित ले लिया this के समान कोड), उस फ़ाइल से थोक लोडिंग, और फ़ाइल को बाद में हटाया जा रहा है।
स्रोत
2015-06-03 18:36:32
संभावित डुप्लिकेट [क्या एक सी # प्रोग्राम मेमोरी में एक टेक्स्ट फ़ाइल पढ़ सकता है और फिर उस ऑब्जेक्ट को उस विधि में पास कर सकता है जिसके लिए फ़ाइल नाम की आवश्यकता होती है?] (Http://stackoverflow.com/questions/6308208/can-ac-sharp- प्रोग्राम-रीड-ए-टेक्स्ट-फाइल-इन-मेमोरी-एंड-टू-पास-द-ऑब्जेक्ट-टू) –
इसके अलावा एक और उत्तर [यहां] (http://stackoverflow.com/a/23537155/2144390)। प्रदर्शन के संबंध में, क्या आपने यह देखने के लिए कोई परीक्षण किया है कि डेटा को डिस्क पर डंप करना है और फिर 'MySQLBulkLoader' का उपयोग करना वास्तव में एक समस्या होगी, या वास्तव में कुछ अन्य "अपने स्वयं के रोल" समाधान से भी बदतर होगा जो अस्थायी फ़ाइल का उपयोग नहीं करता है? –