本文主要是介绍Go 秒读32GB大文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在Go中,处理大文件时,一般采用分块读取的方式,以避免一次性加载整个文件到内存中。
1、打开文件
使用os.Open
打开文件
package mainimport ("log""os"
)func main() {file, err := os.Open("xxx.txt")if err != nil {log.Fatal(err)}defer file.Close()
}
2、获取文件信息
使用file.Stat
获取文件的基本信息,包括文件大小
package mainimport ("fmt""log""os"
)func main() {file, err := os.Open("xxx.txt")if err != nil {log.Fatal(err)}defer file.Close()fileInfo, err := file.Stat()if err != nil {log.Fatal(err)}fileSize := fileInfo.Size()fmt.Println(fileSize)
}
3、设置缓冲区大小
为了提高读取效率,使用合适大小的缓冲区
package mainimport ("fmt""io""log""os"
)func main() {//1、打开文件file, err := os.Open("xxx.txt")if err != nil {log.Fatal(err)}defer file.Close()//2、获取文件信息fileInfo, err := file.Stat()if err != nil {log.Fatal(err)}fileSize := fileInfo.Size()fmt.Println(fileSize)//3、设置缓冲区大小bufferSize := 8192 // 8KB 缓冲区大小buffer := make([]byte, bufferSize)
}
4、循环读取文件内容
使用file.Read
循环读取文件内容
package mainimport ("fmt""io""log""os"
)func main() {//1、打开文件file, err := os.Open("xxx.txt")if err != nil {log.Fatal(err)}defer file.Close()//2、获取文件信息fileInfo, err := file.Stat()if err != nil {log.Fatal(err)}fileSize := fileInfo.Size()fmt.Println(fileSize)//3、设置缓冲区大小bufferSize := 8192 // 8KB 缓冲区大小buffer := make([]byte, bufferSize)//4、循环读取文件内容for {bytesRead, err := file.Read(buffer)if err == io.EOF {// 文件读取完毕break}if err != nil {log.Fatal(err)}// 处理读取的数据,例如输出到控制台fmt.Print(string(buffer[:bytesRead]))}
}
5、 关闭文件
package mainimport ("fmt""io""log""os"
)func main() {//1、打开文件file, err := os.Open("xxx.txt")if err != nil {log.Fatal(err)}defer file.Close()//关闭//2、获取文件信息fileInfo, err := file.Stat()if err != nil {log.Fatal(err)}fileSize := fileInfo.Size()fmt.Println(fileSize)//3、设置缓冲区大小bufferSize := 8192 // 8KB 缓冲区大小buffer := make([]byte, bufferSize)//4、循环读取文件内容for {bytesRead, err := file.Read(buffer)if err == io.EOF {// 文件读取完毕break}if err != nil {log.Fatal(err)}// 处理读取的数据,例如输出到控制台fmt.Print(string(buffer[:bytesRead]))}
}
6、案例
package mainimport ("bufio""fmt""log""os""strings"
)func main() {file, err := os.Open("large_file.txt")if err != nil {log.Fatal(err)}defer file.Close()const maxScanTokenSize = 64 * 1024 * 1024 // 64MBbuf := make([]byte, maxScanTokenSize)scanner := bufio.NewScanner(file)scanner.Buffer(buf, maxScanTokenSize)for scanner.Scan() {line := scanner.Text()// 处理每一行的逻辑fmt.Println(line) //打印每一行fields := strings.Split(line, ",") // 假设使用逗号分隔// 处理fields中的每个字段for _, field := range fields {fmt.Println(field)// 可以添加更多处理逻辑}}if err := scanner.Err(); err != nil {log.Fatal(err)}
}
这篇关于Go 秒读32GB大文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!