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的实现。

回到顶部