Golang分批读取并处理大文件的N行数据
Golang分批读取并处理大文件的N行数据 如何编写内存高效的Go语言代码,实现每次从大文件中读取N行进行处理,并持续直到文件结束。
func main() {
fmt.Println("hello world")
}
4 回复
你可以使用 bufio.Scanner 来逐行读取数据,并在读取过程中进行处理。
更多关于Golang分批读取并处理大文件的N行数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
去吧。
感谢。我想写一个小的 Go 语言代码,从大文件中每次读取 5 行并进行处理。然后继续读取接下来的 5 行并处理,重复这个操作直到文件结束。我是 Go 语言新手,刚开始学习。
以下是实现内存高效分批读取大文件并处理每N行的Go代码示例。该方法使用bufio.Scanner逐行读取,避免一次性加载整个文件到内存中。
package main
import (
"bufio"
"fmt"
"os"
)
// processBatch 处理每批N行的数据
func processBatch(batch []string) {
fmt.Printf("Processing batch of %d lines:\n", len(batch))
for i, line := range batch {
fmt.Printf("Line %d: %s\n", i+1, line)
}
fmt.Println("--- Batch completed ---")
}
func main() {
filePath := "large_file.txt"
batchSize := 1000 // 每批处理的行数
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("Error opening file: %v\n", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
batch := make([]string, 0, batchSize)
for scanner.Scan() {
line := scanner.Text()
batch = append(batch, line)
if len(batch) >= batchSize {
processBatch(batch)
batch = batch[:0] // 清空批次,保留底层数组
}
}
// 处理最后不足batchSize的剩余行
if len(batch) > 0 {
processBatch(batch)
}
if err := scanner.Err(); err != nil {
fmt.Printf("Error reading file: %v\n", err)
}
}
该代码的关键特性:
- 使用
bufio.Scanner逐行读取,内存占用恒定 - 预分配批次切片容量避免重复扩容
- 清空批次时保留底层数组减少GC压力
- 正确处理文件结束时的剩余数据
可根据实际需求调整batchSize和处理函数processBatch的实现。

