Python请求的最佳数据块大小
有没有关于选择数据块大小的指导建议?
我试过不同的数据块大小,但没有一个能达到浏览器或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 个回答
你可以按照以下方式来改变数据块的大小条件。
~/apps/erpnext/htdocs/frappe-bench/sites/assets/js$ vi desk.min.js
第一步:
chunk_size = _ref$chunk_size === undefined ? 24576 : _ref$chunk_size, Line
no:2078
根据你的需求进行增加,比如:
chunk_size = _ref$chunk_size === undefined ? 2457600 : _ref$chunk_size,
第二步:
var file_not_big_enough = fileobj.size <= 24576; Line no: 8993
同样根据你的需求进行增加,比如:
var file_not_big_enough = fileobj.size <= 2457600;
根据你的代码,问题可能出在你没有使用缓冲输入输出。简单来说,如果你使用了缓冲,那么每次写入的数据应该会很少(因为有缓冲和线程的原因),而且你可以一次性从网络上获取比较大的数据块(大约3到10兆字节)。
可能我来得有点晚了……不过问题出在你请求文件的方式上。你使用的是非持久的HTTP连接,这意味着每请求一个文件,你都要经历两次往返的时间加上传输文件的时间。简单来说,就是每个文件都要多花两次“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)
在读取和写入之间切换会浪费时间,而且我知道的情况下,块大小的限制只是你能在内存中存储的限制。所以,只要你不太担心内存使用量,可以指定一个较大的块大小,比如1MB(例如1024 * 1024
)甚至10MB。块大小在1024字节范围内(或者更小,听起来你已经测试过更小的大小)会大大减慢处理速度。
如果你想在代码中尽可能提高性能,可以看看io
模块,它提供了缓冲等功能。不过,我觉得将块大小增加1000倍或10000倍左右,可能就能让你达到大部分的性能提升。