[每周一更]-(第118期):Go并发下载中分片应该如何设置?

devtools/2024/10/18 16:52:33/

在这里插入图片描述

最近处理个需求,在服务器中压缩一个文件,然后进行下载到本地操作,但是由于文件大小不一,设置并发下载的时候就指定了固定的并发数,但是这个并发数应该如何设置更能提升效率呢,我们下边来分析下:

我个人方法是通过文件大小判断,然后设置不同的并发数,然后通过文件大小和并发数平均分,来进行并发下载,来提升效率,当然还有很多其他方面考虑;

在 Go 并发分片下载的设计中,分片的设置对性能有着关键影响。综合分析分片大小应该根据以下几个主要因素来动态调整,以达到最优的下载效率。

网络带宽和延迟

  • 带宽利用率:分片大小过小会频繁发起网络请求,导致网络延迟较大而影响下载速度。为了充分利用带宽,分片应适中,以减少请求的开销。
  • 延迟敏感性:如果网络延迟较高,建议增大分片大小,减少频繁的网络往返。通常可以设置在 1MB 到 10MB 之间。

文件大小

常见分片大小:一般推荐的分片大小在 1MB 到 10MB 之间较为合理。这个范围能在大多数网络环境下提供较好的性能。
小文件(<100MB):对于较小的文件,可以使用稍大的分片,比如 10MB,以减少并发管理的复杂性。
大文件(>1GB):对于大文件,分片可以设置在 1MB 到 5MB,依赖并发数的调整来提升效率。

  • 小文件:对于较小的文件,使用较大的分片,例如 10MB,这样可以减少分片管理的复杂性和请求数量。
  • 大文件:对大文件(如几GB及以上的文件),可以将分片大小设置为 1MB 到 5MB,提高并发请求的数量来加速下载。

服务器限制

  • 并发连接限制:服务器可能会限制客户端的并发连接数。如果设置的分片过小且并发请求过多,可能会导致服务器拒绝连接。因此,合理控制并发数非常重要。
  • 服务器响应速度:如果服务器响应较慢或存在并发限制,可以适当调整分片大小和并发数,确保下载的稳定性。

硬件性能

  • 客户端硬件:并发下载的处理对 CPU、内存有一定的消耗。高并发量会占用更多的资源,因此需要根据客户端硬件性能来调整分片大小和并发数量。
  • I/O 速度:对于 I/O 密集型的任务(如磁盘写入),分片太小也会增加 I/O 操作的频次,反而影响效率。

并发策略

  • 分片大小 vs 并发数:通过合理的分片大小与并发数配合,可以有效提升下载速度。通常推荐的并发下载数在 5 到 10 个线程 之间。
  • 动态调整:可以在下载过程中动态调整分片大小,尤其是根据网络状况、服务器反馈和客户端的资源使用情况,选择合适的并发数和分片大小,可以获得最佳的下载性能。

示例场景分析

  • 高速网络:如果网络带宽充裕,且服务器响应速度较快,可以选择较小的分片(如 2MB),并且提高并发数(如 8~10 个线程)。
  • 低带宽高延迟网络:对于延迟较高的网络环境,建议使用较大的分片(如 10MB),以减少请求频次,同时并发数控制在 5 个左右,确保稳定传输。

示例代码实现

分片下载的核心实现如下:(demo可参考)

package mainimport ("fmt""net/http""os""io""sync"
)func downloadPart(url string, start, end int, wg *sync.WaitGroup, file *os.File) {defer wg.Done()client := &http.Client{}req, _ := http.NewRequest("GET", url, nil)rangeHeader := fmt.Sprintf("bytes=%d-%d", start, end)req.Header.Set("Range", rangeHeader)resp, _ := client.Do(req)defer resp.Body.Close()file.Seek(int64(start), 0)io.Copy(file, resp.Body)}func main() {url := "https://example.com/largefile.zip"fileSize := 1000000000 // 文件大小(字节)partSize := 10000000   // 分片大小(10MB)file, _ := os.Create("largefile.zip")defer file.Close()var wg sync.WaitGroupfor start := 0; start < fileSize; start += partSize {end := start + partSize - 1if end > fileSize-1 {end = fileSize - 1}wg.Add(1)go downloadPart(url, start, end, &wg, file)}wg.Wait()fmt.Println("Download completed!")
}// 部分不同方式处理片段-并发下载文件
func downloadFileConcurrently(sftpClient *SFTPClient, fileSize int64, chunkCount int) {var wg sync.WaitGroupchunkSize := fileSize / int64(chunkCount)// 启动多个协程并发下载for i := 0; i < chunkCount; i++ {wg.Add(1)offset := int64(i) * chunkSize// 处理最后一块if i == chunkCount-1 {chunkSize = fileSize - offset}go downloadChunk(sftpClient, offset, chunkSize, &wg)}wg.Wait()localFileWriteStatus = truefmt.Println("所有分块下载完成")
}

http://www.ppmy.cn/devtools/124653.html

相关文章

HCIP--以太网交换安全(二)端口安全

端口安全 一、端口安全概述 1.1、端口安全概述&#xff1a;端口安全是一种网络设备防护措施&#xff0c;通过将接口学习的MAC地址设为安全地址防止非法用户通信。 1.2、端口安全原理&#xff1a; 类型 定义 特点 安全动态MAC地址 使能端口而未是能Stichy MAC功能是转换的…

linux与window中的脚本编写技巧

1. linux下启动后台任务&#xff1a; nohup python3 server.py >log.txt 2>&1 & 红色为命令&#xff0c;绿色为输出日志 参考 2. windows传输文件到云服务器 scp -i C:\atregret.pem E:\datas\game.txt rootip:~/mutiplay 红色为登录密钥&#xff0c;绿色为…

腾讯IM SDK:TUIKit发送多张图片

一、问题描述 在使用腾讯IM DEMO&#xff08;https://github.com/TencentCloud/chat-uikit-vue.git&#xff09;时发现其只支持发送一张图片&#xff1a; 二、解决方案 // src\TUIKit\components\TUIChat\message-input-toolbar\image-upload\index.vue<inputref"inp…

探索光耦:光耦——电动自行车安全与智能的坚实保障

随着电动自行车市场的蓬勃发展&#xff0c;如何提升其安全性、可靠性和智能化水平已成为行业关注的焦点。在众多关键元件中&#xff0c;光电耦合器&#xff08;简称光耦&#xff09;正以其独特的功能&#xff0c;成为电动自行车设计中的关键角色。下面&#xff0c;让我们一同探…

【红外传感器】STM32C8T6标准库使用红外对管

好好学习&#xff0c;天天向上 前言一、了解红外二、标准库的代码1.infrared.c2.infrared.h3.main.c4 现象 总结 前言 红外线&#xff1a;频率介于微波与可见光之间的电磁波。 参考如下 【STM32】标准库与HAL库对照学习教程外设篇–红外避障传感器 光电红外传感器详解&#…

cnn突破九(我们的五层卷积核bpnet网络就是lenet-1)

cnn突破八中最后说明白了&#xff0c;但没给出结果&#xff0c;我们今天算出结果&#xff1a; 在四层中&#xff1a;.....ds(hocnn[1])*x[17]; 这个公式实际对应14*14&#xff08;x【】&#xff09;-》5*5&#xff08;hocnn【】&#xff09; 同样在5层中&#xff1a;......d…

鸿蒙应用示例:DevEco Testing 工具的常用功能及使用场景

DevEco Studio 是鸿蒙生态中的集成开发环境(IDE)&#xff0c;而 DevEco Testing 工具则是专门用于测试鸿蒙应用的强大工具。本文将详细介绍 DevEco Testing 中几个常用的测试功能及其使用场景&#xff0c;并给出相应的代码示例。 【1】安装应用 使用场景&#xff1a;在鸿蒙系统…

【进阶OpenCV】 (4)--图像拼接

文章目录 图像拼接1. 读取图片2. 计算图片特征点及描述符3. 建立暴力匹配器4. 特征匹配5. 透视变换6. 图像拼接 总结 图像拼接 图像拼接是一项将多张有重叠部分的图像&#xff08;这些图像可能是不同时间、不同视角或者不同传感器获得的&#xff09;拼成一幅无缝的全景图或高分…