读取txt文件中的大批量数据到dataTable中内存溢出

暴雨中de梧桐 2016-03-10 11:14:53
public DataTable DatatoTable(string strFileName)
{
DataTable dt = new DataTable();
dt.Columns.Add("a", typeof(string));
dt.Columns.Add("b", typeof(string));
dt.Columns.Add("c", typeof(string));

StreamReader sr = new StreamReader(strFileName, Encoding.Default);
string sline = sr.ReadLine();

DataRow dr = null;

while (sline != null && sline != "")
{
dr = dt.NewRow();
dr["a"] = sline.Substring(0, 5);
dr["b"] = sline.Substring(5, 5);
dr["c"] = sline.Substring(10, 19);
dt.Rows.Add(dr);
sline = sr.ReadLine();
}
sr.Close();

return dt;

}

代码如上,字段是举出三个,实际有大概100个。txt文件里有50万条数据,每次读到26万左右的时候,就会内存溢出,怎么解决,或者有没有其他方法,从txt文件中读取大批量数据,然后快速导入数据库。
...全文
395 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-03-11
  • 打赏
  • 举报
回复
只为入库,就没有必要经 DataTable 中转 或是只是用小规模的 DataTable(批量插入数据库 的 规模) 如果数据文件是 csv 格式,且无需加工。则可直接使用数据库指令导入数据文件 虽然你需要有个拆分字符串的过程,因比较简单,所以可以先将数据文件直接导入到临时表(或过渡表)中,再用 SQL 指令迁移数据到正式表
socg 2016-03-11
  • 打赏
  • 举报
回复
1、不调试直接运行看看会不会报错 2、检查文件内容,看看每次报错的行数是不是一样,Encoding.Default换成别的试试, 3、可能是不停的创建string,而内存只在空闲的时候才会释放,试试手动调用 System.GC.Collect int tick=0; while (sline != null && sline != "") { ..... if(((tick++)%1000)==0 { System.GC.Collect(); } }
socg 2016-03-10
  • 打赏
  • 举报
回复
如果是窗口程序,在main开头没加
			
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
时,执行长时间未响应的代码也会报错的,在循环中加DoEvents试试
socg 2016-03-10
  • 打赏
  • 举报
回复
看着没什么问题啊,具体错误信息是什么?报错时看看内存是不是占满了?
exception92 2016-03-10
  • 打赏
  • 举报
回复
使用ReadAllIines 试试
暴雨中de梧桐 2016-03-10
  • 打赏
  • 举报
回复
艾玛,代码填错了,就这么看吧= =
huhu88a 2016-03-10
  • 打赏
  • 举报
回复
1、首先定义一个int 变量 row_count,当作计数器 2、sline = sr.ReadLine(); //在这一行下面增加计数器判断,如果row_count>1000 就调用入库的方法 3、然后清空 dt,重置 row_count=0
暴雨中de梧桐 2016-03-10
  • 打赏
  • 举报
回复
引用 9 楼 From_TaiWan 的回复:
既然要写入数据库,就没必要写入datatable,直接入库。分段处理,每次运行在界面输入要读取的范围,例如要读取20万到40万条 int start=200000; //接收20万和40万 int end=400000; int count=0; while (sline != null && sline != "" && count<start) { count++; sline = sr.ReadLine(); } while (sline != null && sline != "" && count<=end) { count++; dr = dt.NewRow(); dr["a"] = sline.Substring(0, 5); dr["b"] = sline.Substring(5, 5); dr["c"] = sline.Substring(10, 19); dt.Rows.Add(dr); sline = sr.ReadLine(); }
我是打算把数据先读到dataTable中,然后在批量插入数据库。如果不读到dataTable中,直接入库,要怎么写?读到流中后。
秋的红果实 2016-03-10
  • 打赏
  • 举报
回复
既然要写入数据库,就没必要写入datatable,直接入库。分段处理,每次运行在界面输入要读取的范围,例如要读取20万到40万条 int start=200000; //接收20万和40万 int end=400000; int count=0; while (sline != null && sline != "" && count<start) { count++; sline = sr.ReadLine(); } while (sline != null && sline != "" && count<=end) { count++; dr = dt.NewRow(); dr["a"] = sline.Substring(0, 5); dr["b"] = sline.Substring(5, 5); dr["c"] = sline.Substring(10, 19); dt.Rows.Add(dr); sline = sr.ReadLine(); }
暴雨中de梧桐 2016-03-10
  • 打赏
  • 举报
回复
引用 7 楼 socg 的回复:
一次性读出来更加是内存不足
怎么解决呢,我想过分批次读,例如20万读一次,但是不知道怎么进行,因为数据都在txt文件里。
socg 2016-03-10
  • 打赏
  • 举报
回复
一次性读出来更加是内存不足
暴雨中de梧桐 2016-03-10
  • 打赏
  • 举报
回复
引用 4 楼 socg 的回复:
如果是窗口程序,在main开头没加
			
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
时,执行长时间未响应的代码也会报错的,在循环中加DoEvents试试
嗯嗯,是winform程序,有这两行代码,但是还是报错,我又加了DoEvents还是报一样的错误
暴雨中de梧桐 2016-03-10
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
使用ReadAllIines 试试
流里没这个方法啊亲,倒是有ReadToEnd,但是那只能读小量数据,数据多了还是会内存溢出。

110,566

社区成员

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

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

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