Go处理大文件应采用流式处理,使用io.Copy实现高效边读边写,或用bufio.Scanner按行解析日志,避免OOM。
在 Go 中处理大文件时,直接读入内存会导致 OOM,正确做法是使用流式处理——边读边写,保持内存占用恒定。核心是利用 io.Copy 或带缓冲的 bufio 配合 os.File 的读写接口,避免一次性加载整个文
件。
io.Copy 是 Go 标准库中专为流式 I/O 设计的函数,内部自动使用 32KB 缓冲区,无需手动管理 buffer,适合大多数场景。
os.O_CREATE | os.O_WRONLY | os.O_TRUNC)io.Copy(dst, src),它会持续从 src 读、向 dst 写,直到 EOF 或错误示例:
dst, _ := os.Create("output.txt")若需逐行解析(如过滤、转换、统计),bufio.Scanner 比 bufio.Reader.ReadLine 更安全简洁,且默认限制每行 64KB,防止单行过大爆内存。
bufio.NewScanner(file) 包装文件对象scanner.Scan(),每次 scanner.Text() 返回当前行(不含换行符)scanner.Buffer(make([]byte, 64*1024), 1
当需要更精细控制(如跳过 BOM、校验、加解密、分块处理),可用 bufio.Reader 和 bufio.Writer 手动读写。
r := bufio.NewReaderSize(f, 64*1024),w := bufio.NewWriterSize(out, 32*1024)
r.Read(p []byte) 或 r.ReadBytes('\n') 等方式读取w.Flush(),否则内容可能滞留在缓冲区流式操作中,文件句柄、网络连接等资源必须显式释放,否则易泄漏。推荐用 defer + 明确 close,同时检查 close 错误(尤其写入后 close 可能触发磁盘 flush 错误)。
w.Flush(),再 w.Close(),并检查两者错误不复杂但容易忽略。