读取一个txt档,然后将数据插入sql server,执行的时候报内存溢出,有时候提示连接已关闭

paradsie1018 2013-12-31 04:32:25
用的是批插的方式
sqlBC.WriteToServer(dt);
之前数据量不是太大,三四十万笔,速度还行,三四十秒
现在数据量变得很大,txt档 150M左右,数据近100W,
//事务处理插入数据库中
public void Exesql()
{
//调用方法TxtFileToStr()
string str = TxtFileToStr();
string[] sql = str.Split(','); //得到string 数组
int num = sql.Length - 1;

一次事务处理直接内存溢出,请问如何分批处理呢?求人指导,程式已经执行不成功了,现在都我手动在处理,头大了.


//读出文本的内容
private string TxtFileToStr()
{
string FilePath = System.Configuration.ConfigurationSettings.AppSettings["FilePath"];//得到文本路径
Console.WriteLine(FilePath);


FileInfo file = new FileInfo(FilePath);
FileStream fs = file.OpenRead();
StreamReader sr = new StreamReader(fs, System.Text.Encoding.GetEncoding("utf-8"));
sr.BaseStream.Seek(0, SeekOrigin.Begin);
string str = sr.ReadToEnd();
fs.Close();
sr.Close();
return str;
}
...全文
162 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcw1967 2014-01-04
  • 打赏
  • 举报
回复
每100行操作,使用文件指针
paradsie1018 2014-01-04
  • 打赏
  • 举报
回复
引用 1 楼 lostuser 的回复:
能确定内存溢出发生在哪吗? sqlBC.WriteToServer(dt); 我猜想你是把数据一次读取,然后构造了一个datatable,对吧?
是的.
wind_cloud2011 2013-12-31
  • 打赏
  • 举报
回复
大量的数据可能要分段处理,
微光黎明 2013-12-31
  • 打赏
  • 举报
回复
可能出的问题原因1:每个数值类型的值都是有上限的,从你写的程序上看你应该是将文本的内容全部一次性读去了,可能超了string,string[]或,int中某项的内存分配的上限了 可能出的问题原因2:数据量太大,内存资源回收不够及时,新数据持续写入导致的溢出 解决办法(仅供参考) 1,换个更大数值类型 2,分批次读取 3,每次往数据库中插入完一条数据后,写个方法,让程序立刻把这部分在内存中已经没用的数据(内存应该还没释放),回收掉,释放内存
雪狐 2013-12-31
  • 打赏
  • 举报
回复
Seek的时候分段读
md5e 2013-12-31
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/340168938
md5e 2013-12-31
  • 打赏
  • 举报
回复
估计 string str = sr.ReadToEnd();这里都受不了 分段读取试试
lostuser 2013-12-31
  • 打赏
  • 举报
回复
能确定内存溢出发生在哪吗? sqlBC.WriteToServer(dt); 我猜想你是把数据一次读取,然后构造了一个datatable,对吧?

111,098

社区成员

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

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

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