C# 按行写入txt大量数据

在 C# 中高效写入大量数据到文本文件时,建议使用 StreamWriter 并逐行写入,避免一次性加载全部数据到内存。以下是完整示例和注意事项:

基础实现

using System.IO;

// 示例:逐行写入 100 万条数据

string filePath = "large_data.txt";

// 使用 StreamWriter 并启用自动刷新缓冲区(或手动控制)

using (StreamWriter writer = new StreamWriter(filePath))

{

for (int i = 0; i < 1_000_000; i++)

{

string line = $"这是第 {i} 行数据";

writer.WriteLine(line);

// 可选:每写入 N 行手动刷新一次(平衡性能与内存)

if (i % 1000 == 0) writer.Flush();

}

}

高性能优化技巧

1、缓冲区设置

通过构造函数指定更大的缓冲区大小(默认 4KB):

using (var writer = new StreamWriter(filePath, append: false, Encoding.UTF8, bufferSize: 65536))

2、异步写入

使用异步方法减少线程阻塞:

using (StreamWriter writer = new StreamWriter(filePath))

{

for (int i = 0; i < 1_000_000; i++)

{

await writer.WriteLineAsync($"异步写入第 {i} 行");

}

}

3、分批次生成数据

避免在内存中累积全部数据:

foreach (var item in GetLargeDataStream()) // 假设这是你的数据源

{

writer.WriteLine(ProcessData(item)); // 逐行处理并写入

}

典型问题解决方案

问题1:文件被占用无法访问

原因:未正确释放 StreamWriter 资源

修复:始终使用 using 语句包裹写入操作

问题2:写入速度慢

优化方案:

禁用 AutoFlush(默认 false)

减少不必要的字符串拼接(用 StringBuilder 预处理复杂行)

升级物理磁盘(SSD 比 HDD 快 10 倍以上)

问题3:内存溢出

现象:写入 1GB+ 数据时程序崩溃

解决:确保数据源是流式(IEnumerable)而非全内存集合

高级场景

追加写入现有文件:

using (var writer = new StreamWriter(filePath, append: true)) // 关键参数

{

writer.WriteLine("----- 这是追加的内容 -----");

}

混合同步/异步写入

var writer = new StreamWriter(filePath);

await writer.WriteLineAsync("Header"); // 异步写开头

writer.WriteLine("Sync Content"); // 同步写主体

await writer.FlushAsync(); // 手动异步刷新

通过以上方法,可在 10 秒内稳定写入 1GB 量级的文本数据(具体性能取决于硬件配置)。

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

相关推荐
南無忘码至尊2 小时前
Unity学习90天-第2天-认识键盘 / 鼠标输入(PC)并实现WASD 移动,鼠标控制物体转向
学习·unity·c#·游戏开发
William_cl2 小时前
C# ASP.NET 分层架构实战:BLL (Service) 业务层从入门到封神(规范 + 避坑)
架构·c#·asp.net
qq_454245033 小时前
图数据标准化与智能去重框架:设计与实现解析
数据结构·架构·c#·图论
CSharp精选营4 小时前
C# 如何减少代码运行时间:7 个实战技巧
性能优化·c#·.net·技术干货·实战技巧
hhh3u3u3u16 小时前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
加号316 小时前
【C#】实现沃德普线光控制器通信控制(附完整源码)
开发语言·c#
lzhdim18 小时前
SharpCompress:跨平台的 C# 压缩与解压库
开发语言·c#
~plus~20 小时前
.NET 8 C# 委托与事件实战教程
网络·c#·.net·.net 8·委托与事件·c#进阶
beyond谚语20 小时前
接口&抽象类
c#·接口隔离原则·抽象类
新手小新21 小时前
C#学习笔记1-在VS CODE部署C#开发环境
笔记·学习·c#