爬虫发现的链接比下载的速度快得多时,请求会堆在调度器里。内存队列每个请求占多少?meta 里的东西算不算?JOBDIR 能省多少内存、代价是什么?这篇用 5 万个积压请求量一遍。
N队列 start() 耗时 s 积压 RSS 增量 MiB 每个请求约 KiB
10000内存 0.17 9999 10.3 1.05
10000磁盘 JOBDIR 0.22 9999 0.3 0.03
50000内存 0.91 49999 54.9 1.12
50000磁盘 JOBDIR 1.07 49999 0.2 0.00默认队列把每个等待下载的请求都留在内存里,大小随请求数线性增长,meta 里放的东西也算在内。
无 meta:见上一节;带 1 KB meta:RSS 增量 120.1 MiB(每个请求约 2.46 KiB),start() 耗时 0.94 s
设了 JOBDIR 之后请求序列化到磁盘队列,进程内存几乎不再随积压增长,代价是序列化耗时(这里约 20%)和请求必须可 pickle。
JOBDIR 总大小 11.1 MiB,每个请求约 234 字节;文件:0s=11412 KiB
上百万级积压(比如 start() 一次产出全部 URL)时内存队列会占 GB 级内存;此时改用 JOBDIR,或让 start() 按下载节奏分批产出。