ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# 使用流读取大型TXT文本文件

2022-08-04 12:05:04  阅读:170  来源: 互联网

标签:文件 fs 读取 C# arrList 内存 文本文件 new TXT


一、前言

业务需要读取txt的内容,导入到数据库当中,博主百度了各种方法,大部分都会导致内存溢出异常,由此结合网上的各种方法,解决了该异常。

二、程序框架

.NET 4.5

WinForm

三、具体实现

1.1 TXT结构

 

 

 

 

 

 


可以看到该文件大小300多兆,里面的条数差不多60w左右,每行当中的数据使用Tab分割

1.2 代码

private void NewInsert1306(string fileDir)
        {
            FileStream fs = new FileStream(fileDir, FileMode.Open, FileAccess.Read);//创建一个文件流 参数(文件位置,打开此文件(如果没有会抛异常),文件访问权限(只读))
            StreamReader sr = new StreamReader(fs);//创建一个txt读取流,从字节流中读取字符 参数(流)
            using (var db = new CFTech.His.Models.DbContext())
            {
                try
                {
                    Stopwatch sw = new Stopwatch();//计时器
                    sw.Start();//开始计时
                    int num = 0;//计算总条数
                    db.BeginTransaction();
            //死循环,由于不知道到底有几行,跳出时机在循环体内部判断 while (true) { var arrList = new List<string>();//存放读取的数据 while (true) { var str = sr.ReadLine();//读取一行内容返回改行的字符串(一个换行符一行),fs有一个fs.position属性(流的位置),该属性在进行任何读取操作时会根据读取的实际情况进行移动,当该位置到达流的末尾时,此方法返回null,该位置也可手动设置fs.position=xxx(long类型) if (str == null) break;//跳出时机就是读完的时候 arrList.Add(str); if (arrList.Count > 10000) break;//该跳出用于入库,博主这里10000条入一次库 } if (arrList.Count == 0) break;//当存放数据的list条数为0时,循环就可以结束了 num += arrList.Count(); ResBase res = Insert1306(arrList);//该方法就是具体的入库操作了,可根据自己的实际情况去写 if (res.ErrCode == -1) { MessageBox.Show(res.ErrMsg); return; } } db.CommitTransaction(); fs.Close();//释放文件流 sw.Stop();//停止计时 MessageBox.Show("入库条数:" + num.ToString()+"------" + "耗时:" + sw.Elapsed); return; } catch (Exception e) { MessageBox.Show(e.Message); db.RollbackTransaction(); } } }

1.3效率(数据库:Oracle,orm框架:fireasy)

该方法为同步方法,全在主线程上操作,效率肯定没有异步快,UI会出现假死情况,以后在研究吧,差不多1分钟入库6w多,由于行业性质,勉强能接受吧

 

1.4遇到的坑

 

 这是同事之前用的方法,他也没想到会遇到这么大的txt,该方法读取文件中的所有行,并且将每行数据转换为数组,对于小文件很方便,但是当文件大于一定程度时,必定会抛内存溢出异常,至于到底支持多大的文件,就没有具体测试了(个人认为和内存无关,计算机为16G内存,运行次方法时还没开始跑内存就直接抛了异常,可能是框架原因,亲测在core里面,使用相同方法,读取同一个20w行的文本,framework直接抛异常,core成功运行)

 

 

 

 

 

END-----------------欢迎大家留言讨论

标签:文件,fs,读取,C#,arrList,内存,文本文件,new,TXT
来源: https://www.cnblogs.com/Bourne-blog/p/16550120.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有