首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python请求的理想块大小

python请求的理想块大小
EN

Stack Overflow用户
提问于 2014-04-29 23:57:39
回答 3查看 28.8K关注 0票数 31

有没有关于选择块大小的指导原则?

我尝试了不同的区块大小,但它们的下载速度都不能与浏览器或wget下载速度相媲美

以下是我的代码的快照

代码语言:javascript
复制
 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和浏览器时..速度仍然是不可比的

谢谢

EN

回答 3

Stack Overflow用户

发布于 2014-05-01 04:37:27

在读取和写入之间切换会浪费时间,并且块大小的限制是AFAIK只能存储在内存中的内容的限制。所以,只要你不太关心保持较低的内存使用率,那么就指定一个较大的块大小,比如1MB(例如1024 * 1024)甚至10MB。1024字节范围内的块大小(甚至更小,因为听起来您测试过的块大小要小得多)将大大减慢该过程。

对于非常繁重的情况,您希望从代码中获得尽可能多的性能,您可以考虑使用io模块进行缓冲等。但我认为将块大小增加1000倍或10000左右可能会使您实现大部分目标。

票数 13
EN

Stack Overflow用户

发布于 2020-08-15 01:11:17

我可能太晚了..。但问题在于您请求对象(文件)的方式。您使用的是非持久的http连接,这意味着对于每个文件,您需要两次往返时间+ file.This的传输时间基本上意味着它需要为每个文件添加两个ping时间。假设平均ping时间为330毫秒,那么每个文件的平均ping时间为660毫秒。只有10个文件,这已经是大约6-8秒了。解决方案是使用会话,它为您的所有请求建立一个持久的http连接。此外,使用raise_for_status()方法比检查内容是否为空更容易

代码语言:javascript
复制
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)
票数 4
EN

Stack Overflow用户

发布于 2014-04-30 03:10:24

根据您的代码,问题很可能是您没有使用缓冲IO。如果这样做,那么每次对write的调用都应该非常短(因为它是缓冲和线程化的),并且您可以从网络中获取相当大的块(3-10Mb)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23369625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档