在我的一个脚本中,我大量使用数组来临时存储数据。我面临的问题是我有很多处理数组的代码,这样我就可以经济地利用空间。
既然 Node.js 数组是关联数组,我还应该麻烦吗?
我当前的解决方案是:
//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;
或者会导致内存大量消耗吗?
array 是使用它的模块的全局变量。
减少代码(我删除了所有未链接到数组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
之外什么都没有,并且开始仅在 array[1000]` 处有数据,我是否在浪费内存?
最佳答案
Can I just do:
i = i + 1; array[i] = null;
Or would it lead to large consumption of memory?
是的,考虑到array
是一个全局变量,本身不会被垃圾回收,不断地填充它值(即使只有null
那些)最终会让你耗尽内存。
你的get_id
方法回收未使用的id确实有效,但是性能非常低——它需要线性时间来找到新的id。因此,它适用于并发任务很少的少数用户,但无法扩展。
您宁愿使用一个对象并从中删除
键,这样您在计数时就不会遇到问题:
var count = 0;
var missions = {};
function somethingThatNeedsTheStore() {
var id = count++;
missions[id] = …;
// later
delete missions[id];
}
// repeatedly call somethingThatNeedsTheStore()
或者实际上,在最近的 Node 版本上,您应该考虑使用 Map
相反:
var count = 0;
var missions = new Map;
function somethingThatNeedsTheStore() {
var id = count++;
missions.set(id, …);
// later
missions.delete(id);
}
// repeatedly call somethingThatNeedsTheStore()
关于javascript - 我应该费心清理 Node.js 中的数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33388729/