gpt4 book ai didi

javascript - 我应该在 node.js 中清理数组吗?

转载 作者:行者123 更新时间:2023-11-29 21:39:49 24 4
gpt4 key购买 nike

在我的一个脚本中,我大量使用数组来临时存储数据。我面临的问题是我有很多代码处理数组,这样我就可以经济地利用空间。

既然 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;

还是会导致内存消耗大?

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

减少代码(我删除了所有未链接到数组 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] 处有数据,我是在浪费内存吗?

最佳答案

Can I just do:

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

Or would it lead to large consumption of memory?

是的,考虑到 array 是一个全局变量并且不会被垃圾回收,不断地用值填充它(即使只有 null ones) 最终会让你耗尽内存。

您的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com