为什么Node(+ Cheerio)使用这么多内存?

时间:2013-09-27 00:34:41

标签: javascript node.js http request cheerio

我目前正在尝试使用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操作,这似乎对内存使用率影响最大。有没有办法清除完全用于每个函数调用的数据?感谢。

3 个答案:

答案 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

我怀疑切换会降低你的内存使用量。