在我的一个脚本中,我广泛使用数组来临时存储数据。我遇到的问题是我有很多处理数组的代码,所以我经济地利用了这个空间。
因为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]处开始拥有数据,那么我是在浪费内存吗?
答案 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()