我应该打扰在node.js中清理数组吗?

在我的一个脚本中,我广泛使用了数组来临时存储数据。 我面临的问题是我有很多代码处理数组,所以我经济地使用这个空间。

我应该甚至打扰,因为Node.js数组是关联数组?

我目前的解决scheme是:

//Get the minimum empty id in array function get_id(callback) { var i = 0; while(array[i] != null) { i = i + 1; } array[i] = 0; callback(i); } get_id(function (i) { array[i] = {large object}; //... array[i] = null; }); 

但我觉得这是错误的,容易出错。

我可以做:

 array[i] = {large object}; i = i + 1; //... array[i] = null; 

还是会导致大量的内存消耗?

数组是使用它的模块的全局variables。

减less代码(我已经删除所有计算没有链接到数组player.active_mission):

 var player = {}, missions = [{time: 1000}]; function end_mission(mission, squad, mission_log, callback) { //Make all the computing of the mission to know if the player won... callback(mission_log); } function get_ami(callback) { var i = 0; while(player.active_mission[i] != null) { i = i + 1; } player.active_mission[i] = 0; callback(i); } function wait_mission(mission, squad, mission_log, i, time, callback) { setTimeout(function () { console.log('End of mission'); player.active_mission[i] = null; end_mission(mission, squad, mission_log, callback); }, time); } function start_mission(mission, squad, callback) { var mission_log = {mission: mission, time_start: new Date(), completed: false, read: false}; //Verify if the player can start the mission... console.log('start_mission'); get_ami(function (i) { player.active_mission[i] = {mission: mission, squad: squad, mission_log: mission_log} wait_mission(mission, squad, mission_log, i, missions[mission].time, callback); }); } player.active_mission = []; //This part is inside get request, after sanitizing all input start_mission(0, [0, 1], function (r) { //r.id = req.session.player_id; if(r.error) { console.log('start: error: ' + r.error); } else { console.log('start: Success: ' + r.result); } }); 

player.active_mission保存玩家的所有未完成请求,如果玩家在完成之前退出,则需要保存。 我的问题是,如果我应该尝试保持它与小id,或者只是继续.push()并获得与.length()的ID?

简而言之:如果一个数组只有1000个第一个id的null ,并且只在数组[1000]开始有数据,那么我是在浪费内存吗?

我可以做:

 i = i + 1; array[i] = null; 

还是会导致大量的内存消耗?

是的,考虑到这个array是一个全局variables,并且不会被垃圾收集本身, 不断地用值填充 (即使只有null )最终会让你用完内存。

回收未使用的id的get_id方法确实有效 ,但是性能不佳 – 需要线性时间才能find新的id。 所以它适用于less数并发任务的用户,但不会扩展。

你宁愿要使用一个对象,并从中delete键,然后在计数时不会遇到问题:

 var count = 0; var missions = {}; function somethingThatNeedsTheStore() { var id = count++; missions[id] = …; // later delete missions[id]; } // repeatedly call somethingThatNeedsTheStore() 

或者实际上,在最近的节点版本中,应该考虑使用Map来代替:

 var count = 0; var missions = new Map; function somethingThatNeedsTheStore() { var id = count++; missions.set(id, …); // later missions.delete(id); } // repeatedly call somethingThatNeedsTheStore() 

NodeJS有一个垃圾收集器来销毁无法访问的对象/数组/variables。

所以当你做array[i] = {large object}; ,大对象将在内存中,它将留在这里。 当你做array[i] = null; ,垃圾收集器将擦除大对象(当然,只有当然没有其他引用这个对象)。

所以,是的,删除对无用对象的引用总是好的,让垃圾收集器清理它。

对1000个null (或undefined)数组的内存的影响不会很大。

如果你想保留你的内存,你应该使用一个对象而不是一个数组。 你可以用这个语法来使用它:

 var obj = {}; obj[id] = {large object}; // Free the id delete obj[id];