我目前正在尝试使用Node来监控网页的变化。但问题是,在一些页面加载之后,node.exe的内存使用速度非常快,一次大约40-50 Mb。我已经确定问题来自我的代码的这一部分:
var cheerio = require('cheerio');
function getPage () {
http.get( 'some.url.com' , function (res) {
var page = '';
res.on('data', function (chunk) {
page += chunk; //commenting THIS
});
res.on('end', function (err) {
$ = cheerio.load(page); // and THIS makes the program run OK.
event.emit('pageLoaded');
});
});
}
setInterval(getPage,40000);
我正在使用Cheerio模块进行一些DOM操作,这似乎对内存使用率影响最大。有没有办法清除完全用于每个函数调用的数据?感谢。
答案 0 :(得分:0)
看起来你正在将$
变成一个“隐含的”全局变量。尝试将更改$ = ...
添加到var $ = ...
,看看是否可以改善效果。
答案 1 :(得分:0)
尝试数组连接而不是字符串连接,以避免这么多不必要的中间版本的chunk1,chunk1And2,chunk1Through3,chunk1Through4等。将数据块存储在一个数组中,并在它们全部加载后加入它们。
function getPage () {
http.get( 'some.url.com' , function (res) {
var chunks = [];
res.on('data', function (chunk) {
chunks.push(chunk);
});
res.on('end', function (err) {
$ = cheerio.load(chunks.join(''));
event.emit('pageLoaded');
});
});
}
有没有办法清除完全用于每个函数调用的数据?
没有。 JavaScript是垃圾收集的,没有用户土地API以任何方式影响垃圾收集器的行为。只是不要泄漏变量或保留对不再需要的对象的引用,这就是你能做的一切。
答案 2 :(得分:0)
我怀疑你对请求模块感到满意,而不是使用原始http。它返回一个cheerio可以解析的流。这是一个例子:How to most efficiently parse a web page using Node.js
我怀疑切换会降低你的内存使用量。