python请求的理想块大小

python请求的理想块大小,python,performance,python-requests,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.ite

是否有关于选择块大小的指导原则

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


谢谢

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

在读取和写入之间切换会浪费时间,数据块大小的限制仅限于您可以存储在内存中的内容。因此,只要您不太关心如何降低内存使用率,就可以继续指定一个较大的块大小,例如1MB(例如
1024*1024
)甚至10MB。1024字节范围内的块大小(或者更小,因为听起来您已经测试过更小的大小)将大大降低处理速度


对于非常繁重的情况,如果您希望从代码中获得尽可能多的性能,您可以查看用于缓冲等的
io
模块,但我认为将块大小增加1000或10000倍左右可能会让您在大部分情况下达到目的。

您可以如下更改块大小条件

~/apps/erpnext/htdocs/frappe bench/sites/assets/js$vi desk.min.js
步骤1:

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\u不够大\u=fileobj.size我可能太晚了。。。但问题在于如何请求对象(文件)。您使用的是非持久性http连接,这意味着对于每个文件,您需要2次往返+文件的传输时间。这基本上意味着每个文件需要增加两次ping时间。平均ping为330毫秒,即每个文件的ping为660毫秒。只有10个文件,这已经是大约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)

您正在下载的资源有多大?大约3-10 MB您尝试了多少块大小?我尝试了1024的milultiples。。。即。。。。1,2,3,4,8,16,256,512... Thanks@user3570335那么,你找到合适的数据块大小了吗?我不是下行投票者,但我不认为缓冲IO对于从线路上获取大数据块是必要的。如果有什么不同的话,情况可能恰恰相反——如果没有缓冲IO,那么获取大块数据更为重要。缓冲IO可能会提高性能,但我认为OP比缓冲IO和非缓冲IO有更大的问题;也就是说,块大小本身。@AndrewGorcest你倒过来了:使用无缓冲IO意味着应用程序在单个线程中在读和写之间切换。我理解这一部分!我认为大数据块在这种情况下很有用的原因是代码只会在读写之间切换几次而不是成千上万次,并且磁盘访问将是一次长写而不是许多小写。在写入之前将一个非常大的块加载到内存中实际上是对内存的缓冲;写操作不会是并发的,但至少会以全速进行,从内存中的数据开始,并且使用最少的上下文切换。@AndrewGorcester不,问题不在切换。事实上,他们是连环作战。在这种情况下,从远程连接读取可能需要很长时间;事实上,这可能需要比写作更长的时间。从根本上说,使用同步IO对这个应用程序的性能是一个打击。正如我提到的,我一直尝试到512*1024,但速度仍然没有提高。所以我猜这与请求模块或windows读取优先级有关。。因为我使用了一个用python编写的程序。。而且速度要快得多--注意它是编译程序哦,我看错了。我以为你试过1,2,3,4,而不是1024*这些数字。嗯,那样的话我不确定。首先,我会将一个巨大的数据块(比如10MB或更大)中的读取定时到内存中的临时文件,并查看该速度的比较;如果可行,那么将其写入磁盘并比较结果。切换时间不是问题。速度-代码-->400-500 kb,wget和其他1-1.2 MB粗略地说,这是一个非常大的差距。如果块大小适当地大,那么我不相信这或者缺少缓冲IO是问题所在。错误的语言@NarendraSharma。这个问题被标记为
python
,用python编写,标题中包含“python”。
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)