gpt4 book ai didi

go - 如何在golang中用小内存读取大文件?

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:38 26 4
gpt4 key购买 nike

<分区>

我有这样的文档,我想循环读取大小为 5GB 的每个文件,我尝试了一些方法,例如 (file, err := ioutil.ReadFile(filename)) 但它会将整个文件加载到内存中。我使用这个函数来加载文件:

func visit(files *[]string) filepath.WalkFunc {
return func(path string, info os.FileInfo, err error) error {
if err != nil {
log.Fatal(err)
}
*files = append(*files, path)
return nil
}
}

对于我使用的读取文件:

file, err := os.Open("file")
if err != nil {
log.Fatal(err)
}
defer file.Close()
buf := make([]byte,10*1024)
for {
n, err := file.Read(buf)
if n > 0 {
fmt.Print(buf[:n])
}
if err == io.EOF {
break
}

我要解析buf中的数据

err = xml.Unmarshal(buf, &m)
if err != nil {
log.Fatal(err)
}
fmt.Println(m)

m 是:

type M struct {
Mc []struct {
Id string `xml:"id"`
NeId string `xml:"neid"`}`xml:"mc"`
Mr struct {
Mh []string `xml:"mh"`}`xml:"mr"`
}

在 func main 中:

func main() {
var files []string
root := "/folder/files"
err := filepath.Walk(root, visit(&files))
if err != nil {
panic(err)
}
for _, file := range files {

但是执行时间太长,我应该怎么做才能加快这个过程?我在第 496 行收到错误 XML 语法错误:意外的 EOF。并发在这种情况下可能有用吗?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com