gpt4 book ai didi

go - 同时从文件中读取字节

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

我用 Go 编写了一个程序,它从文件中读取单个字节并检查设置了哪些位。这些文件通常非常大(大约 10 - 100 GB),所以我不想将整个文件读入内存。该程序通常必须检查数百万个单独的字节。

现在,我执行这些读取的方式是使用 os.File.ReadAt()。这最终变得非常慢,所以我尝试使用 Goroutines 来加速它。例如:

var wg sync.WaitGroup
threadCount := 8

for i := 0; i < threadCount; i += 1 {
wg.Add(1)
go func(id int) {
defer wg.Done()
index := id
myByte := make([]byte, 1)

for index < numBytesInFile-1 { // Stop when thread would attempt to read byte outside of file
fmt.Println(file.ReadAt(myByte, index))
index += threadCount
}
}(i)
}
wg.Wait()

但是,在这里使用 Goroutines 根本没有加快程序的速度(事实上,由于开销,它使程序稍微变慢了)。我本以为只要以只读模式打开(我在我的程序中这样做),就可以同时读取光盘上的文件。我要求的是不可能的,还是有什么方法可以在 Go 中对文件进行并发读取?

最佳答案

你的缓慢是因为 I/O 而不是 CPU。添加更多线程不会加快您的程序。阅读阿姆达尔定律。 https://en.wikipedia.org/wiki/Amdahl%27s_law

如果您不想将整个文件读入内存,您可以使用缓冲读取器并分段读取 https://golang.org/pkg/bufio/#NewReader或者您甚至可以考虑使用实验性内存映射文件包:https://godoc.org/golang.org/x/exp/mmap

要了解有关内存映射文件的更多信息,请参阅 https://en.wikipedia.org/wiki/Memory-mapped_file

关于go - 同时从文件中读取字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49868199/

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