go - 重复查找大文件并写入会影响写入速度吗?

标签 go

我需要加快下载大文件的速度,并且为此使用了多个连接。我在这里使用单个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/

相关文章:

Go 工厂方法返回类型接口(interface),而不是实现接口(interface)的结构

linux - Goroutine长时间处于IO等待状态

dictionary - 如何防止将类型用作映射键?

postgresql - 如何将 NULL 值插入 UUID 而不是零

Golang MongoDB 错误 : result argument must be a slice address - (Arrays)

用于下载进度的 Golang 和本地 Web 界面?

mongodb - Golang使用MongoDB报告 "context deadline exceeded"

angular - API调用后如何重定向

C++ 命名管道客户端不会读取超过 4096 字节

go - 在自定义范围内生成随机数