今儿个跟大伙唠唠StreamWriter那点事儿。前两天在项目里处理日志文件,好家伙,几万条数据直接怼进去,程序卡得跟老爷车似的,气得老板差点把我显示器拍桌上!折腾了一宿,总算摸透了几个实用招数,这就把踩坑过程掰开了揉碎了讲明白。
一、内存炸锅的教训
刚开始傻不愣登写了段这玩意儿:
using (var writer = new StreamWriter("*"))
{
foreach (var log in hugeLogList)
{
*($"{*}:{log}");
}
跑起来直接内存飙升90%!后来才明白,每写一行就调一次WriteLine,跟拿瓢舀大海似的,效率低到姥姥家。
二、攒大招批量输出
改成先拿StringBuilder攒着:
var sb = new StringBuilder();
foreach (var log in hugeLogList)
{
*($"{*}:{log}");
}
*("*", *());
内存倒是稳住了,可百万级数据拼字符串时CPU风扇嗷嗷叫,跟开拖拉机似的。
三、开闸泄洪的妙招
老司机指点说试试AutoFlush开关:
using (var writer = new StreamWriter("*")
{ AutoFlush = false }) //←关键在这儿!
{
foreach (var log in hugeLogList)
{
*(log);
if (count++ % 1000 == 0) *();
}
每攒够1000条手动Flush()一次,内存占用直接砍半,速度还嗖嗖的!
四、字符乱码的血泪史
发给客户的CSV文件打开全是火星文:"€" 变 "€"。连夜翻文档才发现得这么写:
using (var writer = new StreamWriter("*",
false, *8)) //←第三个参数救大命
{
//写数据代码...
特意加了个带BOM的UTF8才搞定,*8这参数不加真能坑死人。
五、资源泄露的惨案
有回偷懒没写using:
var writer = new StreamWriter("*");
*("测试");
结果程序跑着跑着报"文件被占用",重启服务器才解决。现在打死我都这么写:
using (var writer = new StreamWriter(...))
{
//操作代码
} //←到这自动关门落锁
折腾完这五招,现在处理GB级日志文件跟玩儿似的。记住两个保命口诀:批量操作省内存,using用完随手关。你们要是有更野的路子,评论区掰头!