使用Python从Swift下载1.2G文件遇MemoryError,求代码优化方案
解决Swift大文件下载内存溢出问题
你的问题根源是一次性将1.2G的ISO文件全部加载到内存中,conn.get_object()默认会把对象完整内容读取到内存,直接导致内存占用飙升并触发MemoryError。
修改方案是采用分块读取+流式写入,让程序每次只加载一小部分文件内容到内存,写完再读下一块,具体代码如下:
import swiftclient # 建立Swift连接 conn = swiftclient.client.Connection( auth_version='1', user='admin:admin', key='admin9', authurl='http://172.16.101.79:6789/auth/v1.0' ) container_name = 'storage2' object_name = 'mu_visual_cpp_build_tools_2015_update_3_x86_dvd_779b35c8.iso' save_path = 'D:\\100\\mu_visual_cpp_build_tools_2015_update_3_x86_dvd_779b35c8.iso' # 指定分块大小(这里设为1MB,可根据需求调整,比如65536=64KB) chunk_size = 1024 * 1024 # 获取分块迭代器,不会一次性加载全部内容 obj_iter = conn.get_object(container_name, object_name, resp_chunk_size=chunk_size) # 逐块写入文件 with open(save_path, 'wb+') as f: for chunk in obj_iter[1]: f.write(chunk)
关键改动说明
- 添加
resp_chunk_size参数:告诉swiftclient每次返回指定大小的数据块,而非整个文件 - 迭代分块内容:通过遍历
obj_iter[1]获取每一块数据,逐块写入本地文件,内存仅保留当前块的内容,不会出现内存暴涨
内容的提问来源于stack exchange,提问作者Andrew8460958
相关产品推荐
相关产品推荐

