我需要加快下载大文件的速度,并且为此使用了多个连接。我在这里使用单个goroutine来访问磁盘,并且它使用 channel 从多个goroutine接收数据。
file, _ := os.Create(filename)
down.destination = file
for info := range down.copyInfo {
down.destination.Seek(info.start, 0)
io.CopyN(down.destination, info.from, info.length)
}
}
问题是,在重复使用大文件时,查找似乎会使操作变慢。当info.length
较大时,它必须寻求较少的次数,并且看起来可以更快地完成工作。但是我需要使info.length
更小。有没有办法使寻求更快?还是应该将每个部分都下载到单独的临时文件中并最终将它们连接起来?
最佳答案
搜索本身不执行任何I/O,而只是设置文件在下一次读取或写入时的位置。因此,搜寻次数本身并不重要。也可以通过添加伪寻道轻松地对其进行测试,而无需进行任何后续的读取或写入操作。
问题可能不是寻道数,而是写操作数。与许多小片段相比,对于许多小片段,将需要更多的I/O操作来写入数据。而且,这些I/O操作中的每一个都有相当大的开销。系统调用本身存在开销。如果片段未在基础存储的块边界对齐,则可能会有开销。旋转磁盘定位到实际扇区可能会产生开销。
关于go - 重复查找大文件并写入会影响写入速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64842700/