本人写了一个爬虫,每天定时爬取指定网站的内容,挺方便的。问题来了:我的爬虫运行几天感觉服务器会好卡, top看它耗去的内存,居然跟一个b2b网站耗的内存差不多,后来有人跟我说用child.process的exec执行,这样一个任务结束时,会释放内存。 我对这方面不太了解,希望大牛指点一下,顺便分享一下大家用什么方法来处理这些问题的(进程、内存、回收等)。有图更好。谢谢!!
3 回复
首先检查一下是否有内存泄露,也就是说是否保持着一些随时间增加的数据的引用,导致这部分内存没法被垃圾回收释放。
当然,一般这种情况都是很隐蔽不易发现的,所以一个简单的办法就是用 forever, supervisor 这类进程管理工具运行,然后在程序中加一句 setTimeout(process.exit, 3600 * 1000)
定时重启。
谢谢大牛的意见。 求讨伐!! 我用 pm2 start do_timer.js 启动
do_timer.js 文件 require(‘iced-coffee-script’).register(); require(‘./timer.iced’);
timer.iced 文件 later = require “later” later.date.localTime()
Health = require './iced.crawler/health'
health_composite = [{dw: [1], h: [3], m: [1]}]
health_sched = {schedules:health_composite}
console.log "health:"+JSON.stringify(health_sched)
t = later.setInterval ->
await health.do_page health_url, defer()
, health_sched
health.iced 文件
do_page: (page_url, cb)->
console.log '\n进入do_page,获取单个 :', page_url
await read page_url,
headers:
cookie:"bdshare_firstime=123abc; "
, defer err, article, meta
console.error err if err
await jsdom.env article.html, [jquery], defer errors, window
$ = window.$
for a ,i in Array::slice.apply $(".new_article li a")
item_url = $(a).attr('href')
console.log item_url
await [@fetch_item](/user/fetch_item) item_url, defer()
cb()