Golang秒读32GB大文件,如何读取?

发布时间 2023-12-28 09:41:22作者: 技术颜良

在Go中,处理大文件时,一般采用分块读取的方式,以避免一次性加载整个文件到内存中。以下是读取大文件的简洁步骤:

打开文件: 使用os.Open打开文件。

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

获取文件信息: 使用file.Stat获取文件的基本信息,包括文件大小。

fileInfo, err := file.Stat()
if err != nil {
    log.Fatal(err)
}
fileSize := fileInfo.Size()

设置缓冲区大小: 为了提高读取效率,使用合适大小的缓冲区。

bufferSize := 8192 // 8KB 缓冲区大小
buffer := make([]byte, bufferSize)

 

循环读取文件内容: 使用file.Read循环读取文件内容。

for {
    bytesRead, err := file.Read(buffer)
    if err == io.EOF {
        // 文件读取完毕
        break
    }
    if err != nil {
        log.Fatal(err)
    }

    // 处理读取的数据,例如输出到控制台
    fmt.Print(string(buffer[:bytesRead]))
}

关闭文件: 读取完成后关闭文件。

file.Close()

下面是一个完整的读取大文件的示例代码:

package main

import (
    "bufio"
    "log"
    "os"
)

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

    const maxScanTokenSize = 64 * 1024 * 1024 // 64MB
    buf := make([]byte, maxScanTokenSize)

    scanner := bufio.NewScanner(file)
    scanner.Buffer(buf, maxScanTokenSize)

    for scanner.Scan() {
        line := scanner.Text()
        // 处理每一行的逻辑
    }

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