0

我需要加快下载大文件的速度,为此我使用了多个连接。我正在使用一个可以访问磁盘的 goroutine,它使用一个通道从多个 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更小。有没有办法让搜索更快?还是我应该只下载每个部分以分隔临时文件并最后将它们连接起来?

4

1 回答 1

2

查找本身不执行任何 I/O,而只是设置文件中的位置以供下一次读取或写入。因此,自行搜索的次数可能并不重要。这也可以通过添加虚拟搜索来轻松测试,而无需任何后续读取或写入操作。

问题可能不是查找次数,而是写操作的次数。与使用几个大片段相比,使用许多小片段将需要更多的 I/O 操作来写入数据。而且这些 I/O 操作中的每一个都有很大的开销。有系统调用本身的开销。如果片段未在底层存储的块边界对齐,则可能会产生开销。旋转磁盘以定位到实际扇区可能会产生开销。

于 2020-11-15T09:40:46.033 回答