是否有关于选择块大小的指南?
我尝试了不同的块大小,但没有一个提供与浏览器或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和浏览器时..速度仍然没有可比性由于
答案 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)