新闻中心

如何在Golang中读取大文件

2025-11-09
浏览次数:
返回列表
使用流式读取避免内存溢出,推荐bufio.Scanner按行处理文本文件,bufio.Reader按块读取二进制数据,禁用ioutil.ReadAll读大文件,合理设置缓冲区并结合性能优化技巧。

如何在golang中读取大文件

在Golang中读取大文件时,不能一次性将整个文件加载到内存中,否则容易导致内存溢出。正确的做法是使用流式读取,逐块处理数据。以下是几种高效、安全的读取大文件的方法。

使用 bufio.Scanner 按行读取

当大文件是文本格式(如日志文件),且需要按行处理时,bufio.Scanner 是最常用的方式。它自动处理缓冲,适合逐行读取超大文件。

  • 默认缓冲区大小为 4096 字节,可通过 scanner.Buffer() 调整
  • 遇到换行符自动分割,适合处理每行数据较小的场景
  • 不适用于超长行(超过缓冲区)的情况,需手动设置更大缓冲区

示例代码:

file, err := os.Open("large.log")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

scanner := bufio.NewScanner(file)
for scanner.Scan() {
    line := scanner.Text()
    // 处理每一行
    processLine(line)
}

if err := scanner.Err(); err != nil {
    log.Fatal(err)
}

使用 bufio.Reader 读取字节块

如果文件不是纯文本或需要更灵活的控制,可以使用 bufio.Reader 手动读取固定大小的字节块。这种方式适用于二进制文件或自定义分隔符的场景。

  • 可设置任意大小的缓冲区,例如 64KB 或 1MB
  • 支持 Read()、ReadByte()、ReadString() 等多种读取方式
  • 适合处理非换行分隔的数据流

示例:按块读取

移动端无限滚动加载瀑布流 移动端无限滚动加载瀑布流

里面有2个文件夹。其中这个文件名是:finishing,是我项目还没有请求后台的数据的模拟写法。请求后台数据之后,瀑布流的js有一点点变化,放在文件名是:finished。变化在于需要穿参数到后台,和填充的内容都用后台的数据填充。看自己项目需求来。由于chrome模拟器是不允许读取本地文件json的,所以如果你要进行测试,在hbuilder打开项目就可以看到效果啦,或者是火狐浏览器。

移动端无限滚动加载瀑布流 93 查看详情 移动端无限滚动加载瀑布流
file, err := os.Open("bigdata.bin")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

reader := bufio.NewReader(file)
buffer := make([]byte, 65536) // 64KB 缓冲

for {
    n, err := reader.Read(buffer)
    if n > 0 {
        // 处理 buffer[0:n]
        processData(buffer[:n])
    }
    if err == io.EOF {
        break
    }
    if err != nil {
        log.Fatal(err)
    }
}

使用 ioutil.ReadAll 的注意事项

ioutil.ReadAll 会把整个文件读入内存,仅适用于小文件。对于大文件,这种方式非常危险。

  • 不要用于 GB 级别的文件
  • 可能导致程序内存占用飙升甚至崩溃
  • Go 1.16 后推荐使用 io.ReadAll 替代 ioutil.ReadAll

正确替代方式仍是流式读取。

提升性能的小技巧

在处理真正的大文件时,可以结合以下优化手段:

  • 适当增大缓冲区大小(如 1MB),减少系统调用次数
  • 使用 os.OpenFile 并传入只读标志,避免额外开销
  • 考虑使用 mmap(通过 syscall 或第三方库如 mmap-go)对某些只读场景加速
  • 若需并发处理,可将文件分段交由多个 goroutine 处理(注意偏移和边界)

基本上就这些。关键是避免一次性加载,始终采用流式处理。根据文件类型选择 Scanner 或 Reader,合理设置缓冲区,就能稳定高效地读取大文件。

以上就是如何在Golang中读取大文件的详细内容,更多请关注其它相关文章!


# 还没有  # 吉林关键词排名合作商家  # 三沙清镇网站优化  # 延安网站优化seo培训  # 雪兰分公司昆明营销推广  # 义乌市奇山陵园网站建设  # 营销推广相关知识  # 吉林全网推广营销  # 网站推广排名代理费用  # 新品牌营销线上推广  # 云浮网络网站建设  # 就能  # 放在  # go  # 有一  # 如何在  # 流式  # 自定义  # 死锁  # 加载  # 大文件  # 内存占用  # ssl  # 字节  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  AO3官网镜像链接 Archive of Our Own同人文在线浏览  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  Angular Material 垂直步进器:实现底部到顶部排序的教程  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  PDF文件体积过大处理_PDF压缩技巧详解  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  Golang如何使用net/url解析URL_Golang URL解析与处理方法  Django表单提交验证失败后保持字段值不刷新  yandex入口引擎手机版 yandex安卓版下载入口  外媒分析《GTA6》定价:卖100美元可以但真没必要!  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  C++ map遍历方法大全_C++ map迭代器使用总结  蛙漫安全无毒 官方认证的绿色入口  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  大象笔记网页版入口 印象笔记网页版登录入口  德邦快递查询平台 德邦快递物流信息查询入口  夸克AO3官网入口_AO3镜像网站2025推荐  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  C++ vector二维数组定义_C++ vector of vector用法  2025-2030年全球乘用车销量预测:新能源成增长主力  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  如何在Promise链中优雅地中断后续then执行  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  J*aScript map 方法中处理循环元素为空数组的策略  Lar*el Excel导入时生成自定义递增ID的策略与实践  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  如何使 Jest 模拟函数默认抛出错误以提高测试效率  J*aScript中向JSON对象添加新属性的正确姿势  《主播少女的秘密账号迷宫》首支宣传片  Python模块化编程:有效管理依赖与避免循环引用  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  Python实现多节点属性重叠度分析教程  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  Python大型XML文件高效流式解析教程 

搜索