使用Python requests上传7G文件CPU占满的原因咨询
大文件上传导致CPU占满、内存飙升的原因分析
上传小文件时本地CPU无明显占用,但上传7G大小的文件时,本地CPU被完全占满,系统近乎停滞,同时程序内存占用随运行时间线性增长。以下是用于向Web API上传文件的Python代码片段:
import requests import json api_url = "https://ourserver/ourserverfolder/api/auth/Login" dto = { "username": "ourusename", "password": "ourpassword" } headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' } response = requests.post(api_url, data=json.dumps(dto), headers=headers) response_obj = response.json() bearer = response_obj["token"] upload_url = "https://anotherserver/anotherserverfolder/UploadFile" filename = r"D:\bigfile.zip" filenamewithoutfolder = filename.split('\\')[-1] with open(filename, 'rb') as f: file = (filenamewithoutfolder, f, 'application/x-zip') upload_files = { "file": file } upload_headers = { 'Authorization': 'Bearer ' + bearer } upload_response = requests.post(upload_url, files=upload_files, headers=upload_headers, verify=False)
具体原因
- 内存缓冲区问题:requests库默认会将
files参数对应的文件完整加载到内存中,再构建请求发送。对于7G的超大文件,这会导致内存占用随文件读取持续线性增长,同时内存中处理海量数据的操作会大量消耗CPU资源。 - multipart/form-data构建机制:requests在生成multipart/form-data格式的请求体时,需要预先计算整个请求的总长度。为了得到这个长度,它会读取文件的全部内容,而非边读取文件边发送请求。这个扫描整个文件的过程会持续占用CPU,同时文件内容全部加载进内存进一步加剧了资源消耗。
内容的提问来源于stack exchange,提问作者Anders Lindén
相关产品推荐
相关产品推荐

