【问题标题】:Why is Node (+Cheerio) using so much RAM?为什么 Node (+Cheerio) 使用这么多 RAM?
【发布时间】:2013-09-27 00:34:41
【问题描述】:

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

【问题讨论】:

标签: javascript node.js http request cheerio


【解决方案1】:

尝试使用数组连接而不是字符串连接,以避免出现太多不必要的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 以任何方式影响垃圾收集器的行为。只是不要泄漏变量或持有对不再需要的对象的引用,这就是你所能做的。

【讨论】:

  • 感谢您,内存上限为 150Mb 左右,这不是很低,但它不再更高了。
【解决方案2】:

看起来你正在将$ 变成一个“隐含的”全局变量。尝试将 $ = ... 更改为 var $ = ...,看看是否会有所改善。

【讨论】:

    【解决方案3】:

    我怀疑你会更喜欢请求模块而不是使用原始 http。它返回cheerio 可以解析的流。这是一个例子:How to most efficiently parse a web page using Node.js

    我怀疑切换会减少您的内存使用量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 2022-01-06
      • 2023-03-05
      • 2013-06-06
      • 2012-06-28
      相关资源
      最近更新 更多