PDA

View Full Version : سوال: مشکل با ورود دیتای بالای 10 میلیون رکورد با فایل CSV



samanff2000
پنج شنبه 26 اسفند 1400, 11:07 صبح
با سلام خدمت تمام دوستان
من دارم یه برنامه مینویسم که باید هر ماه یکسری مقادیر رو که توسط فایل CSV گرفته میشه در برنامه وارد کنم . برای این کار دو نوع کد نوشتم و زمان هردو بسیار زیاد بود (برای 100000 رکورد حدود 5دقیقه و 20 ثانیه زمان) با توجه به اینکه فایل های ورودی حدودا بالای 10 میلیون رکورد دارن(و حدود 60 ستون) این نوع ورود اطلاعات خیلی کند و زمان بر خواهد بود . آیا روش دیگه ای هست که بشه اطلاعات رو با زمان کمتری وارد SQL کرد ؟ البته نه از خود SQL و حتما توسط برنامه این کار انجام بشه .
با تشکر

string line;
int i = 0;
using (System.IO.StreamReader sr = new System.IO.StreamReader(File_name))
{
while (!sr.EndOfStream)
{
line = sr.ReadLine();
if (i == 0)
{ i++; }
else
{



string[] tokens = line.Split(',');
a = DataSet.tashilat.NewRow();
a["IDTASHILAT"] = tokens[0].Replace('"', ' ').Trim();
a["BRNCH_COD"] = tokens[1].Replace('"', ' ').Trim();
a["LOAN_MINOR_TYPE"] = tokens[2].Replace('"', ' ').Trim();
.
.
.
DataSet.tashilat.Rows.Add(a);
i++;
}
}
tashilat TableAdapter.Update(DataSet.tashilat);
sr.Close();
MessageBox.Show("عملیات با موفقیت به پایان رسید /n تعداد '" + "" + "'رکورد ثبت گردید", "ثبت دیتا", MessageBoxButtons.OK, MessageBoxIcon.Information);
progressBar1.Visible = false;
label2.Visible = false;

SMRAH1
پنج شنبه 26 اسفند 1400, 12:32 عصر
سلام
این حجم بالا داده کلا زمان می بره (خوندن از هارد، تفسیر و انتقال به پایگاه داده). ولی با مفاهیم bulk update و bulk insert میشه یه مقدار زمان را بهبود داد.مثلا شبیه این راه حل ها

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/performing-batch-operations-using-dataadapters

https://stackoverflow.com/questions/20635796/bulk-update-in-c-sharp

samanff2000
شنبه 28 اسفند 1400, 12:55 عصر
سلام دوست عزیز . من کدم رو به صورت زیر تغییر دادم . برای 100000 رکورد هیچ مشکلی نداره و سریع انجام میشه اما برای 12000000 رکورد با پیام ادامه و بعدش هم با خطا مواجه میشه که عکسش رو هم میفرستم خدمتتون . آیا امکان داره زمان رو بیشتر کرد که خطای تایم اوت نگیره ؟ یا روش دیگه ای که بشه 12000000 رکورد رو وارد کرد ؟

int i = 0; using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(l_ravabetTableAdapter.Connection.Conne ctionString))
{
sqlBulkCopy.BatchSize = 100000;
sqlBulkCopy.NotifyAfter = 5000;
using (System.IO.StreamReader sr = new System.IO.StreamReader(File_name))
{
while (!sr.EndOfStream)
{
line = sr.ReadLine();
if (i == 0)
{ i++; }
else
{




string[] tokens = line.Split(',');
a = DataSet.L_ravabet.NewRow();
a["L_baranch_code"] = tokens[0].Replace('"', ' ').Trim();
a["L_minortp"] = tokens[1].Replace('"', ' ').Trim();
a["L_cif"] = tokens[2].Replace('"', ' ').Trim();
a["L_serial"] = tokens[3].Replace('"', ' ').Trim();
a["CONMNTYP"] = tokens[4].Replace('"', ' ').Trim();
a["RELCODE"] = tokens[5].Replace('"', ' ').Trim();
a["CURRENCY_COD"] = tokens[6].Replace('"', ' ').Trim();
a["state"] = tokens[7].Replace('"', ' ').Trim();
a["balance"] = tokens[8].Replace('"', ' ').Trim();
a["EF_date"] = txt_file.Text.Trim();
DataSet.L_ravabet.Rows.Add(a);
i++;
}
}
sqlBulkCopy.DestinationTableName = "dbo.L_ravabet";
sqlBulkCopy.WriteToServer(DataSet.L_ravabet);
DataSet.L_ravabet.Rows.Clear();
sr.Close();
MessageBox.Show("عملیات با موفقیت به پایان رسید \n تعداد '" + i + "'رکورد ثبت گردید", "ثبت دیتا", MessageBoxButtons.OK, MessageBoxIcon.Information);




153736

telegram
دوشنبه 08 فروردین 1401, 07:52 صبح
سلام
شما بیاین اول از فایلتون بخونید و داخل یه دیتاتیبل بریزین بعد از SqlBulkCopy استفاده کنید اینطوری خطای timeout نمیده

samanff2000
یک شنبه 14 فروردین 1401, 11:04 صبح
سلام وقت بخیر . من این کار رو انجام دادم ولی به خطا خوردم ممکنه روی کد توضیح بدید ؟
اگر نیاز بود بفرمایید کدی رو هم که تست کردم بفرستم خدمتتون

Mahmoud.Afrad
پنج شنبه 18 فروردین 1401, 08:46 صبح
ارور تایم اوت میده، تایم اوت کانکشن رو افزایش بدید.

rahmatipoor
پنج شنبه 25 فروردین 1401, 22:50 عصر
تایم اوت کانکشن رو روی 0 قرار بدید نامحدود میشه