Python中Scrapy在Linux下内存占用非常大的问题如何解决?
我是爬取一个视频网站,爬取到地址放到 file piplines 中去下载
在 Mac 上占用内存很小,只有 100M 多
放到了阿里云上,内存占用非常大,有 700M 多
请教这是怎么回事
Python中Scrapy在Linux下内存占用非常大的问题如何解决?
5 回复
贴代码,还有两个环境部署的文件配置,阿里云什么系统什么配置
这个问题我遇到过,Scrapy在Linux下内存飙升通常是因为请求队列和中间件数据堆积。
核心解决方法是控制并发和及时清理内存。在settings.py里加上这些配置:
# 控制并发请求数
CONCURRENT_REQUESTS = 16
CONCURRENT_REQUESTS_PER_DOMAIN = 8
# 启用自动限速
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 5.0
AUTOTHROTTLE_MAX_DELAY = 60.0
# 调整调度器队列
SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.DownloaderAwarePriorityQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.pqueues.FifoMemoryQueue'
# 及时清理请求对象
REQUEST_FINGERPRINTER_IMPLEMENTATION = '2.7'
# 禁用不需要的中间件
EXTENSIONS = {
'scrapy.extensions.memusage.MemoryUsage': None,
}
如果还不行,在spider里手动控制:
class MySpider(scrapy.Spider):
custom_settings = {
'CLOSESPIDER_ITEMCOUNT': 1000, # 抓取1000个item后自动停止
'DOWNLOAD_DELAY': 0.5, # 下载延迟
}
def parse(self, response):
# 及时释放response内存
data = response.css('div.content').get()
response = None # 手动释放
# 控制yield频率
for item in self.process_data(data):
yield item
if self.should_pause(): # 自定义暂停逻辑
import time
time.sleep(1)
用telnet监控内存:telnet localhost 6023,然后输入est()查看状态。
建议用scrapy bench测试不同配置下的内存表现。
配置用的默认的,阿里云就是最低配的那个 1 核 1G 内存 Ubuntu 18 的系统
我自己分析发现,减少并发数量可以降低内存,推测是由于服务器网速快,所以默认的 16 个线程都能满速下载,然后下载的时候,scrapy 用的 requests 应该设置的 chunked 比较大
我这个推测应该不准,我修改了配置文件,改成了 ip 域名,都是 3 个线程,依然内存会爆

