有没有关于选择块大小的指导原则?
我尝试了不同的区块大小,但它们的下载速度都不能与浏览器或wget下载速度相媲美
以下是我的代码的快照
r = requests.get(url, headers = headers,stream=True)
total_length = int(r.headers.get('content-length'))
if not total_length is None: # no content length header
for chunk in r.iter_content(1024):
f.write(chunk)
如有任何帮助,我将不胜感激。
编辑:我尝试了不同速度的网络..而且我能够实现比我的家庭网络更高的速度..但是当我测试wget和浏览器时..速度仍然是不可比的
谢谢
发布于 2014-05-01 04:37:27
在读取和写入之间切换会浪费时间,并且块大小的限制是AFAIK只能存储在内存中的内容的限制。所以,只要你不太关心保持较低的内存使用率,那么就指定一个较大的块大小,比如1MB(例如1024 * 1024
)甚至10MB。1024字节范围内的块大小(甚至更小,因为听起来您测试过的块大小要小得多)将大大减慢该过程。
对于非常繁重的情况,您希望从代码中获得尽可能多的性能,您可以考虑使用io
模块进行缓冲等。但我认为将块大小增加1000倍或10000左右可能会使您实现大部分目标。
发布于 2020-08-15 01:11:17
我可能太晚了..。但问题在于您请求对象(文件)的方式。您使用的是非持久的http连接,这意味着对于每个文件,您需要两次往返时间+ file.This的传输时间基本上意味着它需要为每个文件添加两个ping时间。假设平均ping时间为330毫秒,那么每个文件的平均ping时间为660毫秒。只有10个文件,这已经是大约6-8秒了。解决方案是使用会话,它为您的所有请求建立一个持久的http连接。此外,使用raise_for_status()方法比检查内容是否为空更容易
import requests
session = requests.Session()
r =session.get(url, headers = headers, stream = true)
r.raise_for_status()
for chunk in r.iter_content(1024):
f.write(chunk)
发布于 2014-04-30 03:10:24
根据您的代码,问题很可能是您没有使用缓冲IO。如果这样做,那么每次对write的调用都应该非常短(因为它是缓冲和线程化的),并且您可以从网络中获取相当大的块(3-10Mb)。
https://stackoverflow.com/questions/23369625
复制相似问题