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

时间:2015-10-28 10:34:19

标签: javascript arrays node.js

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

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

我目前的解决方案是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/rss/channel">
    <table>
      <xsl:apply-templates select="item" />
    </table>
  </xsl:template>
  <xsl:template match="item">
    <tr>
      <td><a href="{link}"><xsl:value-of select="title" /></a></td>
      <td><img src="{image}" /></td>
      <td><xsl:value-of select="date" /> <xsl:value-of select="time" /></td>
    </tr>
  </xsl:template>
</xsl:stylesheet>

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

我可以这样做:

//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是使用它的模块的全局变量。

减少代码(我删除了所有未链接到数组player.active_mission的计算):

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

player.active_mission保存玩家的所有未完成请求,如果玩家在完成之前退出,则需要保存。我的问题是,如果我应该尝试使用小ID,或者继续使用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); } }); 并获取.push()的ID?

简而言之:如果一个数组除了.length()之外只有1000个第一个id,并且只在数组[1000]处开始拥有数据,那么我是在浪费内存吗?

2 个答案:

答案 0 :(得分:1)

NodeJS有一个垃圾收集器来破坏无法访问的对象/数组/变量。

所以,当你执行xtype: 'widgetcolumn', text: 'Price', width: 200, widget:{ xtype: 'combo', store: Ext.create('Ext.data.Store',{ fields:['rate','description','show'] filters:[{property:'show',value:"yes"}] }), displayField:'description', valueField:'rate', onWidgetAttach: function (column, widget, record){ widget.getStore().setData(record.get("rateArray")); } }, 时,大对象将在内存中并保留在此处。执行array[i] = {large object};时,垃圾收集器将擦除大对象(当然,只有在没有其他对此对象的引用时)。

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

1000 array[i] = null;(或未定义)数组对内存的影响不会很大。

如果要保留内存,则应使用对象而不是数组。您可以使用以下语法:

null

答案 1 :(得分:1)

  

我可以这样做:

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

或者会导致大量内存消耗?

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

回收未使用的ID get_id方法确实有用,但是非常难以理解 - 它需要线性时间来查找新ID。因此,它可以为几个并发任务很少的用户工作,但它不会扩展。

您更愿意使用对象和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()
相关问题