C# 高效读取大文件

在 C# 中高效读取大文件时,需根据文件类型和场景选择不同的技术方案,以下为综合实践方法及注意事项:

一、文本文件读取方案

逐行读取

StreamReader.ReadLine‌:通过流式处理逐行加载文本,避免一次性加载整个文件到内存,适合超大文本文件(如日志文件)。

using (StreamReader sr = new StreamReader("file.txt", Encoding.UTF8, bufferSize: 1024*1024))

{

string line;

while ((line = sr.ReadLine()) != null)

{

// 处理每行数据

}

}

File.ReadLines():返回 IEnumerable<string> 实现惰性加载,语法简洁但需注意异常处理(如文件不存在时抛出 FileNotFoundException)。

分批次处理

结合数据库事务分批入库(如每 1 万条提交一次),减少内存峰值和 I/O 压力:

List<string> batch = new List<string>(10000);

while ((line = sr.ReadLine()) != null)

{

batch.Add(line);

if (batch.Count >= 10000)

{

InsertToDatabase(batch);

batch.Clear();

}

}

二、二进制文件读取方案

FileStream + 字节数组

直接操作字节流,适合非文本文件(如图像、音视频):

using (FileStream fs = new FileStream("file.bin", FileMode.Open))

{

byte[] buffer = new byte[4096];

int bytesRead;

while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)

{

// 处理二进制数据块

}

}

BufferedStream 加速

对底层流添加缓冲区(默认 4KB),减少直接访问存储设备的频率,提升 I/O 效率。

三、优化技巧

**缓冲区设置:**通过 StreamReader 构造函数指定 bufferSize(如 1MB),平衡内存与读取频率。

**编码处理:**明确指定文本编码(如 Encoding.GetEncoding("GB2312"))避免乱码。

**资源释放:**使用 using 语句确保流对象及时释放,防止内存泄漏。

四、方案对比

方法 适用场景 内存占用 灵活性

StreamReader 超大文本逐行处理 低 高(可控性强)

File.ReadLines() 中小文本简洁操作 中 中

FileStream 二进制文件处理 低 高

注意事项: 对于超大规模文件(如数十 GB),需避免 File.ReadAllLines 等一次性加载方法,防止内存溢出

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
缺点内向4 小时前
C#: 高效移动与删除Excel工作表
开发语言·c#·.net·excel
yue0086 小时前
C# 分部类读取学生信息
开发语言·c#
聪明努力的积极向上7 小时前
【C#】事件简单解析
开发语言·c#
qq_12498707538 小时前
基于C#的贵州省黔北地区乡村避暑生活共享平台设计与实现(源码+论文+部署+安装)
c#·毕业设计·asp.net·生活
LateFrames13 小时前
C# 中,0.1 在什么情况下不等于 0.1 ?
开发语言·c#
mudtools19 小时前
解放双手!使用Roslyn生成代码让你的 HTTP 客户端开发变得如此简单
低代码·c#·.net
张人玉21 小时前
WPF 数据绑定与转换器详解
c#·wpf·light
主宰者21 小时前
WPF CalcBinding简化判断逻辑
c#·.net·wpf
就是有点傻1 天前
使用PaddleOCRSharp大模型精选文字识别
c#
LeonDL1681 天前
【通用视觉框架】基于C#+Winform+OpencvSharp开发的视觉框架软件,全套源码,开箱即用
人工智能·c#·winform·opencvsharp·机器视觉软件框架·通用视觉框架·机器视觉框架