txt数据导入sql sever内存溢出出错

dickwxyz 2016-04-09 04:29:55
private void button1_Click(object sender, EventArgs e)
{
string cnnString = "Trusted_Connection=SSPI;Data Source=" + textBox1.Text + ";Initial Catalog=" + textBox2.Text + ";";
//Trusted_Connection=SSPI; Data Source = 服务器名; Initial Catalog = 数据库名; integrated security=SSPI;
SqlConnection cnn = new SqlConnection(cnnString);
string sql;
sql = " CREATE TABLE [" + textBox2.Text + "].[dbo].[" + textBox4.Text +
"](id varchar(50) NOT NULL," +
"host varchar(50) NOT NULL DEFAULT '1'," +
"number varchar(32) NOT NULL," +
"add_time varchar(50) NOT NULL," +
"rented varchar(50) DEFAULT NULL," +
"warn varchar(32) DEFAULT NULL," +
"rfid varchar(32) DEFAULT NULL," +
"rfid_dte varchar(32) DEFAULT NULL," +
"obd_mile varchar(32) DEFAULT NULL," +
"engine_t varchar(32) DEFAULT NULL," +
"mileage varchar(32) DEFAULT NULL," +
"speed varchar(32) DEFAULT NULL, " +
"motor varchar(32) DEFAULT NULL," +
"oil varchar(32) DEFAULT NULL," +
"power varchar(32) DEFAULT NULL," +
"ev_battery varchar(16) DEFAULT NULL," +
"charging varchar(32) DEFAULT NULL," +
"fuel_mileage varchar(32) DEFAULT NULL," +
"electric_mileage varchar(32) DEFAULT NULL," +
"endurance varchar(32) DEFAULT NULL," +
"temperature varchar(32) DEFAULT NULL," +
"csq varchar(32) DEFAULT NULL," +
"power_consumption varchar(32) DEFAULT NULL," +
"longitude varchar(32) DEFAULT NULL," +
"latitude varchar(32) DEFAULT NULL," +
"num varchar(50) DEFAULT NULL," +
"currenttime varchar(50) DEFAULT NULL," +
"mo_data varchar(20) DEFAULT NULL)";
SqlCommand command = new SqlCommand(sql, cnn);
cnn.Open();
command.CommandTimeout = 0;
command.ExecuteNonQuery();
cnn.Close();

String path = textBox3.Text;
DirectoryInfo folder = new DirectoryInfo(path);
DataTable table = new DataTable();
table.Columns.Add("id");
table.Columns.Add("host");
table.Columns.Add("number");
table.Columns.Add("add_time");
table.Columns.Add("rented");
table.Columns.Add("warn");
table.Columns.Add("rfid");
table.Columns.Add("rfid_dte");
table.Columns.Add("obd_mile");
table.Columns.Add("engine_t");
table.Columns.Add("mileage");
table.Columns.Add("speed");
table.Columns.Add("motor");
table.Columns.Add("oil");
table.Columns.Add("power");
table.Columns.Add("ev_battery");
table.Columns.Add("charging");
table.Columns.Add("fuel_mileage");
table.Columns.Add("electric_mileage");
table.Columns.Add("endurance");
table.Columns.Add("temperature");
table.Columns.Add("csq");
table.Columns.Add("power_consumption");
table.Columns.Add("longitude");
table.Columns.Add("latitude");
table.Columns.Add("num");
table.Columns.Add("currenttime");
table.Columns.Add("mo_data");

SqlBulkCopy bulkCopy = new SqlBulkCopy(cnnString);
foreach (FileInfo file in folder.GetFiles("*.txt"))
{
string fileName = file.FullName;

StreamReader sr = new StreamReader(fileName, Encoding.UTF8);

int linenum=0;
while (sr.ReadLine() != null)
{
linenum = linenum + 1;
}
sr.Close();
StreamReader sr1 = new StreamReader(fileName, Encoding.UTF8);
for (int i = 0; i < linenum / 2; i++)
{
sr1.ReadLine();
}
for (int i = linenum / 2; i < linenum ; i++)
{

string readStr = sr1.ReadLine();
try
{
DataRow dr = table.NewRow();
//string[] str = readStr.Split(new char[] {'\t'});

string[] str = readStr.Split('\t');

string id = str[0];
string host = str[1];
string number = str[2];
string add_time = str[3];
string rented = str[4];
string warn = str[5];
string rfid = str[6];
string rfid_dte = str[7];
string obd_mile = str[8];
string engine_t = str[9];
string mileage = str[10];
string speed = str[11];
string motor = str[12];
string oil = str[13];
string power = str[14];
string ev_battery = str[15];
string charging = str[16];
string fuel_mileage = str[17];
string electric_mileage = str[18];
string endurance = str[19];
string temperature = str[20];
string csq = str[21];
string power_consumption = str[22];
string longitude = str[23];
string latitude = str[24];
string num = str[25];
string currenttime = str[26];
string mo_data = str[27];

dr["id"] = id;
dr["host"] = host;
dr["number"] = number;
dr["add_time"] = add_time;
dr["rented"] = rented;
dr["warn"] = warn;
dr["rfid"] = rfid;
dr["rfid_dte"] = rfid_dte;
dr["obd_mile"] = obd_mile;
dr["engine_t"] = engine_t;
dr["mileage"] = mileage;
dr["speed"] = speed;
dr["motor"] = motor;
dr["oil"] = oil;
dr["power"] = power;
dr["ev_battery"] = ev_battery;
dr["charging"] = charging;
dr["fuel_mileage"] = fuel_mileage;
dr["electric_mileage"] = electric_mileage;
dr["endurance"] = endurance;
dr["temperature"] = temperature;
dr["csq"] = csq;
dr["power_consumption"] = power_consumption;
dr["longitude"] = longitude;
dr["latitude"] = latitude;
dr["num"] = num;
dr["currenttime"] = currenttime;
dr["mo_data"] = mo_data;
table.Rows.Add(dr);
}
catch (Exception)
{
MessageBox.Show(readStr);
}
}
sr1.Close();

}
bulkCopy.BatchSize = 100000;
bulkCopy.DestinationTableName = textBox4.Text;
bulkCopy.ColumnMappings.Add("id", "id");
bulkCopy.ColumnMappings.Add("host", "host");
bulkCopy.ColumnMappings.Add("number", "number");
bulkCopy.ColumnMappings.Add("add_time", "add_time");
bulkCopy.ColumnMappings.Add("rented", "rented");
bulkCopy.ColumnMappings.Add("warn", "warn");
bulkCopy.ColumnMappings.Add("rfid", "rfid");
bulkCopy.ColumnMappings.Add("rfid_dte", "rfid_dte");
bulkCopy.ColumnMappings.Add("obd_mile", "obd_mile");
bulkCopy.ColumnMappings.Add("engine_t", "engine_t");
bulkCopy.ColumnMappings.Add("mileage", "mileage");
bulkCopy.ColumnMappings.Add("speed", "speed");
bulkCopy.ColumnMappings.Add("motor", "motor");
bulkCopy.ColumnMappings.Add("oil", "oil");
bulkCopy.ColumnMappings.Add("power", "power");
bulkCopy.ColumnMappings.Add("ev_battery", "ev_battery");
bulkCopy.ColumnMappings.Add("charging", "charging");
bulkCopy.ColumnMappings.Add("fuel_mileage", "fuel_mileage");
bulkCopy.ColumnMappings.Add("electric_mileage", "electric_mileage");
bulkCopy.ColumnMappings.Add("endurance", "endurance");
bulkCopy.ColumnMappings.Add("temperature", "temperature");
bulkCopy.ColumnMappings.Add("csq", "csq");
bulkCopy.ColumnMappings.Add("power_consumption", "power_consumption");
bulkCopy.ColumnMappings.Add("longitude", "longitude");
bulkCopy.ColumnMappings.Add("latitude", "latitude");
bulkCopy.ColumnMappings.Add("num", "num");
bulkCopy.ColumnMappings.Add("currenttime", "currenttime");
bulkCopy.ColumnMappings.Add("mo_data", "mo_data");
bulkCopy.WriteToServer(table);
bulkCopy.Close();

MessageBox.Show("运行完毕");
}

一个250mb的txt分成一半可以导入,但是全部导入的话在string readStr = sr1.ReadLine();处报错,
“System.OutOfMemoryException”类型的未经处理的异常在 mscorlib.dll 中发生
对于内部用途和新的托管对象,确保要有足够的内存可供分配。
请问这个代码如何修改呢?
...全文
213 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dickwxyz 2016-04-09
  • 打赏
  • 举报
回复
导入数据前exe占用内存7mb,导入一半文件后exe占用内存700mb+,如何释放这些内存呢?
dickwxyz 2016-04-09
  • 打赏
  • 举报
回复
引用 13 楼 dickwxyz 的回复:
[quote=引用 12 楼 xuzuning 的回复:] 你先导后一半,再导前一半,会是什么情况?
我在想就是button1到后一半,然后必须关掉程序,再打开按button2导入前一半,这样才行。 释放资源是什么代码呢?[/quote] 是不是datatable有行数限制?
dickwxyz 2016-04-09
  • 打赏
  • 举报
回复
引用 12 楼 xuzuning 的回复:
你先导后一半,再导前一半,会是什么情况?
我在想就是button1到后一半,然后必须关掉程序,再打开按button2导入前一半,这样才行。 释放资源是什么代码呢?
xuzuning 2016-04-09
  • 打赏
  • 举报
回复
你先导后一半,再导前一半,会是什么情况?
dickwxyz 2016-04-09
  • 打赏
  • 举报
回复
引用 6 楼 lovelj2012 的回复:
把这行
string readStr = sr1.ReadLine();
拿到try里面去,既然这行直接抛出异常,说明没有读到东西,你catch打印readStr有必要么?
试过放进去,就是报错的时间长了点,还是有错。 catch打印readStr是因为有的行并不能分为28列。
dickwxyz 2016-04-09
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
StreamReader sr = new StreamReader(fileName, Encoding.UTF8); 如果文件中存在非 utf-8 字符的话,应该是什么反应?
应该没有。 我把文件分成两部分,然后用两个button分别导入,这样也不行。需要关闭exe,然后再打开输入相同参数后,按第二个button才行。
xuzuning 2016-04-09
  • 打赏
  • 举报
回复
那就是你有资源没有释放
xuzuning 2016-04-09
  • 打赏
  • 举报
回复
StreamReader sr = new StreamReader(fileName, Encoding.UTF8); 如果文件中存在非 utf-8 字符的话,应该是什么反应?
xuzuning 2016-04-09
  • 打赏
  • 举报
回复
对!一般都是读到回车为止 那么什么是异常呢?异常就是不一般!
江南小鱼 2016-04-09
  • 打赏
  • 举报
回复
把这行
string readStr = sr1.ReadLine();
拿到try里面去,既然这行直接抛出异常,说明没有读到东西,你catch打印readStr有必要么?
dickwxyz 2016-04-09
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
8G 内存不能说明什么!服务器也不是你的一个人在用 不过 System.OutOfMemoryException 多半是由于你无限制的使用造成的 如果 sr1.ReadLine() 始终读不到他认为该停止的标志时,那就将耗尽有限的内存了
一般都是读到回车为止,返回结果,这个应该没有错
xuzuning 2016-04-09
  • 打赏
  • 举报
回复
8G 内存不能说明什么!服务器也不是你的一个人在用 不过 System.OutOfMemoryException 多半是由于你无限制的使用造成的 如果 sr1.ReadLine() 始终读不到他认为该停止的标志时,那就将耗尽有限的内存了
dickwxyz 2016-04-09
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
内存不够,除了加内存条,还能有什么办法?
额,8G内存还不够?
xuzuning 2016-04-09
  • 打赏
  • 举报
回复
内存不够,除了加内存条,还能有什么办法?
dickwxyz 2016-04-09
  • 打赏
  • 举报
回复
95行报错

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧