我要下载约1000万张图片,并做了一个小实验,下载了前1000张图片,我发现每张图片需要约4.5秒的时间(使用multiprocessing.Pool
可能会稍有加快),但最大的问题是是平均图片大小为〜2400x2400,约为2.2MB。下载它们后,我可以立即调整它们的大小,但主要的瓶颈(当前)是Internet带宽。是否可以直接以较低的分辨率下载图像?
示例伪代码:
import requests
resp = requests.get("some_url.jpg")
with open(fn, 'wb') as f:
f.write(resp.content)
答案 0 :(得分:3)
除非还有其他分辨率较低的文件可用→否。除非服务器上有某种API或基本上没有任何东西,否则您要从中下载文件(图像),然后在发送内容作为响应之前,先在服务器上修改文件(图像)。
您可以尝试检查网站是否支持gzip
或其他压缩方式,并确保您首先下载压缩后的响应,例如使用this answer,然后在保存文件之前进行解压缩,例如与gzip
或zlib
。
要强制执行,请尝试使用特定的headers,例如Accept-Encoding
。
为数据创建一个简单的计数器(您可以在处理或after you download时对字节进行计数),如果您不想达到例如每5分钟超过100MB左右,则只需为每个下载的100MB块放入time.sleep()
。
Thread
不会帮助您并行处理工作,使用multiprocessing.Pool
或喜欢将消息真正地拆分为多个进程,以便从(随机数)中获取信息。每1分钟以每个进程100个文件为基础,通过4个进程同时下载400个文件,每个进程同时下载100个文件。