如何在Python中实现同一共享网络内稳定5Mbps文件传输限速
稳定控制共享网络文件复制速率的解决办法
为啥你的代码会出现速率波动?
- 一次性读取与带宽匹配的大块数据,写完直接进入延迟等待,导致瞬间占满带宽(出现10-12Mbps峰值),等待期间无数据传输,速率跌到0,形成大幅波动。
- 仅初始化一次
start_time,延迟计算逻辑未考虑读写操作本身的耗时,控制精度不足。 - 共享网络的系统缓存会提前预读文件数据,代码层面的速率控制会被绕过,加剧速率不稳定问题。
改进后的代码:匀速小批量传输
采用小数据块+固定间隔发送的方式,像匀速滴水一样控制传输速率,避免波动:
import time def copy_file_with_stable_bandwidth(source_path, target_path, bandwidth_mbps): # 将Mbps转换为每秒可传输的字节数 bytes_per_sec = bandwidth_mbps * 1024 * 1024 // 8 # 每次传输64KB的小块,平衡传输效率与速率稳定性 chunk_size = 64 * 1024 # 计算每个小块的发送间隔,确保总速率匹配目标带宽 send_interval = chunk_size / bytes_per_sec with open(source_path, "rb") as source_file: with open(target_path, "wb") as target_file: last_send_time = time.time() while True: data = source_file.read(chunk_size) if not data: break # 计算需等待的时间,保证每个块按固定间隔发送 now = time.time() elapsed_since_last = now - last_send_time if elapsed_since_last < send_interval: time.sleep(send_interval - elapsed_since_last) # 写入数据并立即刷新,避免系统缓存攒批发送 target_file.write(data) target_file.flush() # 更新最后一次发送的时间戳 last_send_time = time.time() # 调用示例 source_path = "\\\\MYPESC0NBIT222\\Users\\1.bmp" destination_path = "C:\\Users\\Users\\Desktop\\1.bmp" copy_file_with_stable_bandwidth(source_path, destination_path, 5)
关键优化点说明
- 小数据块传输:将大文件拆分为64KB的小块,避免单次传输占用过多带宽,让速率曲线更平滑。
- 固定间隔发送:每个数据块按计算好的间隔发送,确保总传输速率稳定维持在5Mbps,不会忽高忽低。
- 动态时间跟踪:每次传输后更新时间戳,计算延迟时自动适配读写操作的耗时,控制精度更高。
- 规避系统缓存:小批量传输减少系统预缓存的影响,让代码层面的速率控制逻辑真正生效。
额外提示
如果共享网络的SMB缓存仍干扰速率稳定,可尝试调整系统SMB缓存设置(需管理员权限),比如缩小缓存大小以减少预读取数据量。也可以添加简单的速率监控逻辑,实时打印当前每秒传输字节数,方便验证效果。
内容的提问来源于stack exchange,提问作者randompersonhehe
相关产品推荐
相关产品推荐

