Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python httplib的块大小是';s读取硬编码为8192字节_Python_Http_Httplib - Fatal编程技术网

为什么Python httplib的块大小是';s读取硬编码为8192字节

为什么Python httplib的块大小是';s读取硬编码为8192字节,python,http,httplib,Python,Http,Httplib,我正在寻找一个快速流式下载->上传,通过HTTP将大文件从一台服务器移动到另一台服务器 在此期间,我注意到urllib3使用的httplib(因此也是请求)似乎将每次从流中获取的量硬编码为8192字节 为什么会这样?8192与其他大小相比有什么好处?根据我的发现,块大小应该是资源的页面大小,但由于页面大小仅在UNIX上可用,因此它被硬编码为8192,因此所有其他系统(特别是Windows)在这方面都不会被阻止。否则,就没有其他理由对其进行硬编码 来源:Nginx网络服务器 ProxyIOBuf

我正在寻找一个快速流式下载->上传,通过HTTP将大文件从一台服务器移动到另一台服务器

在此期间,我注意到urllib3使用的httplib(因此也是请求)似乎将每次从流中获取的量硬编码为8192字节


为什么会这样?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
    字节套接字缓冲区
Ruby客户端

在ruby中,该值默认设置为
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个月前的合并