为什么Python httplib的块大小是';s读取硬编码为8192字节
我正在寻找一个快速流式下载->上传,通过HTTP将大文件从一台服务器移动到另一台服务器 在此期间,我注意到urllib3使用的httplib(因此也是请求)似乎将每次从流中获取的量硬编码为8192字节为什么Python httplib的块大小是';s读取硬编码为8192字节,python,http,httplib,Python,Http,Httplib,我正在寻找一个快速流式下载->上传,通过HTTP将大文件从一台服务器移动到另一台服务器 在此期间,我注意到urllib3使用的httplib(因此也是请求)似乎将每次从流中获取的量硬编码为8192字节 为什么会这样?8192与其他大小相比有什么好处?根据我的发现,块大小应该是资源的页面大小,但由于页面大小仅在UNIX上可用,因此它被硬编码为8192,因此所有其他系统(特别是Windows)在这方面都不会被阻止。否则,就没有其他理由对其进行硬编码 来源:Nginx网络服务器 ProxyIOBuf
为什么会这样?8192与其他大小相比有什么好处?根据我的发现,块大小应该是资源的页面大小,但由于页面大小仅在UNIX上可用,因此它被硬编码为8192,因此所有其他系统(特别是Windows)在这方面都不会被阻止。否则,就没有其他理由对其进行硬编码
来源:Nginx网络服务器
ProxyIOBufferSize Directive
Description: Determine size of internal data throughput buffer
Syntax: ProxyIOBufferSize bytes
Default: ProxyIOBufferSize 8192
Context: server config, virtual host
Status: Extension
Module: mod_proxy
这是nginx的
Syntax: client_body_buffer_size size;
Default: client_body_buffer_size 8k|16k;
设置用于读取客户端请求正文的缓冲区大小。如果请求主体大于缓冲区,则整个主体或仅其部分将写入临时文件。默认情况下,缓冲区大小等于两个内存页。这是x86、其他32位平台和x86-64上的8K。在其他64位平台上通常为16K
Apache Web服务器
ProxyIOBufferSize Directive
Description: Determine size of internal data throughput buffer
Syntax: ProxyIOBufferSize bytes
Default: ProxyIOBufferSize 8192
Context: server config, virtual host
Status: Extension
Module: mod_proxy
因此Apache默认情况下也使用8192
作为代理缓冲区大小
Apache客户端
ApacheJava客户机文档指出
- CoreConnectionPNames.SOCKET\u BUFFER\u SIZE='http.SOCKET.BUFFER SIZE':确定在接收/发送http消息时用于缓冲数据的内部套接字缓冲区的大小。此参数需要java.lang.Integer类型的值。如果未设置此参数,HttpClient将分配
字节套接字缓冲区8192
16K
然后有下面的线程
如果您查看其中许多内容,一致认为缓冲区大小为8K/16K。这并不是说它应该被固定,而是可配置的,8k/16K应该适合大多数情况。因此,我认为Python在默认情况下也使用8K没有问题。但是是的,它应该是可配置的
Python3.7
也将如此,但如果您不能升级到相同的版本,这可能对您的事业没有帮助。最初提交于。通过git bull
@ashishnitinpail找到,谢谢。现在我怀疑8192来自补丁#1065257:和。但是,我不认为8192?8k是块设备的常见块大小,因此读取此块大小或其倍数的数据块会更有效。这也是一个常见的http头大小限制(例如在apache中),因此您可以在单个块中传输头。你有什么理由认为它不应该是8k吗?@wim我用64k做了一个测试,使用迭代器作为源流,在这种情况下5gb的传输速度更快。它似乎可以在3.7中配置,原因与你的用例类似。见3个月前的合并