2015-02-06 19 views
0

我使用node.js和io.socket來編寫應該保存所有消息並向兩個新用戶顯示它們的聊天。 消息被存儲到一個對象數組中。 當我測試它的數量爲2MB(複製&粘貼.txt),我的任務管理器顯示我node.js需要大約200MB!從一開始沒有消息它需要~19MB。 所以我問我是否有任何內存泄漏在我的代碼中,或者也許socket.io保存數組通過.emit在第二個數組中使用?node.js通過使用數組消耗很多ram

這是我的代碼:

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 }); 
}); 
}); 
+0

Err..save_object是一個數組,這意味着「save_object ['chat']」意味着你使用一個字符串索引你的數組,這並不是一個好主意。你可能會考慮讓save_object成爲一個對象?此外,使用[]和{}而不是新的Array()和新的Object()是首選。 – 2015-02-06 20:57:34

+0

對於一個完全成熟的Javascript解釋器來說,19M使用了很多庫,聽起來並不是那麼...我不太習慣node.js,但是不存在某種可以附加到程序中的調試器? – 2015-02-06 20:57:36

+0

@MarcusMüller我認爲你錯過了重要的一點,該過程在插入2MB的文本後使用了200MB的內存。 – 2015-02-06 21:09:15

回答

0

我不能確切地告訴你爲什麼會用這麼多的內存,但我想用一個數組來保存歷史是一個糟糕的主意...... 你應該至少使用一個文件,並在閱讀時發送消息(以避免同時在內存中存儲每條消息),或使用數據庫來存儲它們(如果需要在時間戳上請求)... 該文件的解決方案是不是很難寫,會少一點危險......

(順便說一句,我不認爲有任何內存泄漏在你的代碼中......但是你會明白數組肯定會分配更多的空間,並且你存儲的對象將比簡單的文件佔用更多的空間,例如由於節點的緣故,例如索引)

+0

我認爲一個數組只需要它所需要的內存,但我不是一個彙編程序/機器程序員。所以至少memcached/redis只需要儘可能多的內存(只需很小的開銷)? – user3776738 2015-02-06 22:19:30

+0

我認爲redis應該是針對這種東西進行motr優化的......但是不要忘記,如果Redis尚未在您的機器上啓動,它僅僅需要一些內存才能運行它......我不知道多少,你應該嘗試。 – YlinaGreed 2015-02-07 12:05:09