当前位置: 首页 > news >正文

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 等一次性加载方法,防止内存溢出
 

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

相关文章:

  • Spark on Yarn 高可用模式部署流程
  • 如何提高服务器的QPS来应对618活动的并发流量
  • 如何将带有LFS对象的git仓库推送到gitlab
  • 前端(小程序)学习笔记(CLASS 2):WXML模板语法与WXSS模板样式
  • C语言实现顺序存储结构
  • PostgreSQL中的权限管理简介
  • Python爬虫(35)Python爬虫高阶:基于Docker集群的动态页面自动化采集系统实战
  • Terraform创建阿里云基础组件资源
  • Java SpringBoot 扣子CozeAI SseEmitter流式对话完整实战 打字机效果
  • Android 网络全栈攻略(五)—— 从 OkHttp 拦截器来看 HTTP 协议二
  • 使用OpenSSL生成根证书并自签署证书
  • 数据结构(6)线性表-队列
  • 【leetcode】3356. 零数组变换②
  • 字节跳动旗下火山引擎都覆盖哪些领域
  • 四、GPU是如何成为当前电脑中不可或缺的一部分的,opengl在其中起到了什么效果
  • 基于SpringMVC的动态时钟设计
  • youyu:91501
  • 学习黑客Nmap 是什么?
  • React从基础入门到高级实战:React 基础入门 - 简介与开发环境搭建
  • [逻辑回归]机器学习-part11
  • 北京好的网站制作/近期时事新闻10条
  • 网站在工信部备案如何做/网络营销的基本方法有哪些
  • 合肥的电商网站设计/网络营销策划书应该怎么写
  • 有什么网站可以发布个人信息/网推拉新app推广接单平台
  • 网站开发的目的/风云榜
  • 专业网站设计建设/9个成功的市场营销案例