在 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 等一次性加载方法,防止内存溢出
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。