【问题标题】:node.js is consuming much ram by using an arraynode.js 通过使用数组消耗了很多内存
【发布时间】:2015-04-07 02:45:15
【问题描述】:

我正在使用 node.js 和 io.socket 来编写一个应该保存所有消息并向他们显示两个新用户的聊天。 消息存储到对象数组中。 当我用 2MB(复制并粘贴到 .txt)进行测试时,我的任务管理器显示 node.js 需要大约 200MB!从一开始就没有消息,它需要 ~19MB。 所以我问我的代码中是否有任何内存泄漏,或者 socket.io 是否通过在第二个数组中每次使用 .emit 来保存数组?

这是我的代码:

save_object=new Array();
save_object['chat']=new Array();//for the chat room,now there's just this one

io.sockets.on('connection', function (socket) {
// client is connected
socket.emit('chat', { time: new Date(), text: 'you are now connected
to the server!' });
//send all msgs on start
socket.emit('all',save_object['chat']);
// user-send event
socket.on('chat', function (data) {
// send msg
io.sockets.emit('chat', { time: new Date(), 
name: data.name || 'anonymous',  text: data.text });
  //save new msg to the array
  save_object['chat'][save_object['chat'].length]=
  new Object({ time:new  Date(), name: data.name || 'anonymous', 
  text: data.text });
});
});

【问题讨论】:

  • Err..save_object 是一个数组,这意味着“save_object['chat']”意味着您正在使用字符串索引您的数组,这并不是一个好主意。您可能会考虑将 save_object 设为对象?此外,最好使用 [] 和 {} 而不是 new Array() 和 new Object()。
  • 19M 用于一个成熟的 Javascript 解释器,使用了大量的库听起来并不多......我不太习惯 node.js,但不是有某种您可以将调试器附加到您的程序吗?
  • @MarcusMüller 我认为你错过了重要的一点,在插入 2MB 的文本后,该过程使用了 200MB 的内存。
  • 如果再插入 6MB 的文本,它会进一步增加吗?它应该,但不会再增加 600MB。
  • 好吧,@RobRaisch 已经指出了你的字符串索引的问题——另外,插入 2MB 的文本可能会发生在假设 1000 个块中,而这 20B 块中的每一个都有一个 64 位的日期附上一个简单的 10B 用户名,然后是底层解释器对象和堆栈帧——真的,开始调试。单看是做不到的。

标签: arrays node.js memory socket.io


【解决方案1】:

我不能确切地告诉你为什么这会使用这么多内存,但我认为使用数组来保存历史是一个坏主意...... 您至少应该使用一个文件,并在读取它时发送消息(以避免同时将每条消息都放在内存中),或者使用数据库来存储它们(如果您需要请求时间戳)。 .. 文件解决方案写起来不是很困难,而且危险性会小一些……

(顺便说一句,我认为您的代码中没有任何内存泄漏......但是您会明白,数组肯定会分配它需要的更多空间,而您存储的对象会占用更多空间比放在一个简单的文件中,由于节点,例如用于索引)

【讨论】:

  • 我认为一个数组只需要它需要的内存,但我不是汇编程序/机器程序员。所以至少 memcached/redis 只需要尽可能多的内存(只有一个小开销)?
  • 我认为 redis 应该针对这类东西进行 motr 优化......但不要忘记,如果 Redis 尚未在您的机器上启动,那么它只需要一些内存来运行它。 ..我不知道多少,你应该试试。
猜你喜欢
  • 1970-01-01
  • 2014-03-08
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多