javascript - 我应该费心清理 Node.js 中的数组吗?

标签 javascript arrays node.js

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

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

相关文章:

javascript - 将两个回调合并为一个返回

javascript - jQuery/Javascript - 在元素获得焦点时执行操作

javascript - 将 dygraph 内容注入(inject) jquery UI Accordion 不显示

c++ - 非重叠连续子数组的最大长度和

node.js - 如何使用axios通过OAuth登录

javascript - 过滤函数没有返回正确的值

c - malloc 一次,然后在结构数组上分配内存

PHP 不区分大小写的 in_array 函数

javascript - 陷入实现嵌套数据过滤循环的困境,这可能是一种更优雅的方法吗?

node.js - 如何在每个循环内 'continue' : underscore, node.js