python请求的理想块大小

时间:2014-04-29 15:57:39

标签: python performance python-requests

是否有关于选择块大小的指南?

我尝试了不同的块大小,但没有一个提供与浏览器或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和浏览器时..速度仍然没有可比性

由于

4 个答案:

答案 0 :(得分:8)

您将失去在读取和写入之间切换的时间,并且块大小的限制仅为AFAIK可以存储在内存中的限制。因此,只要您不关心保持内存使用率下降,请继续并指定大块大小,例如1 MB(例如1024 * 1024)或甚至10 MB。 1024字节范围内的块大小(或者甚至更小,因为它听起来你测试的尺寸要小得多)会大大减慢这个过程。

对于您希望从代码中获得尽可能多的性能的非常繁重的情况,您可以查看io模块以进行缓冲等。但我认为增加块大小的因素1000或10000左右可能会让你大部分时间到那里。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您可以按照以下

更改块大小条件
~/apps/erpnext/htdocs/frappe-bench/sites/assets/js$ vi desk.min.js
Step1: chunk_size = _ref$chunk_size === undefined ? 24576 : _ref$chunk_size, Line no:2078

按照您的要求增加

 chunk_size = _ref$chunk_size === undefined ? 2457600 : _ref$chunk_size,

第2步: -

var file_not_big_enough = fileobj.size <= 24576; Line no: 8993

根据需要增加喜欢

var file_not_big_enough = fileobj.size <= 2457600; 

答案 3 :(得分:0)

可能为时已晚...但是问题在于您如何请求对象(文件)。您使用的是非永久性的http连接,这意味着每个文件都会产生2次往返+文件的传输时间,这基本上意味着每个文件需要两次ping操作。平均ping为330毫秒(每个文件660毫秒)。仅用十个文件,这已经是大约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)