Python请求的最佳数据块大小

38 投票
4 回答
49780 浏览
提问于 2025-04-18 04:46

有没有关于选择数据块大小的指导建议?

我试过不同的数据块大小,但没有一个能达到浏览器或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 个回答

-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; 
2

根据你的代码,问题可能出在你没有使用缓冲输入输出。简单来说,如果你使用了缓冲,那么每次写入的数据应该会很少(因为有缓冲和线程的原因),而且你可以一次性从网络上获取比较大的数据块(大约3到10兆字节)。

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)
21

在读取和写入之间切换会浪费时间,而且我知道的情况下,块大小的限制只是你能在内存中存储的限制。所以,只要你不太担心内存使用量,可以指定一个较大的块大小,比如1MB(例如1024 * 1024)甚至10MB。块大小在1024字节范围内(或者更小,听起来你已经测试过更小的大小)会大大减慢处理速度。

如果你想在代码中尽可能提高性能,可以看看io模块,它提供了缓冲等功能。不过,我觉得将块大小增加1000倍或10000倍左右,可能就能让你达到大部分的性能提升。

撰写回答