リアルタイムサーバーでのリソース管理
nodejsで大量のオブジェクトを管理する方法
WEB系のPHPerの人は意外にしらないようなので普通のサーバーアプリケーションのリソース管理方法を記載してみる
下のようにシングルトンのマネージャを作成しマネージャ経由でオブジェクトを生成する
削除もマネージャ経由でやる
この方法だと10000個くらいは管理できる
100000個以上管理するなら自前でハッシュを実装したほうが幸せかも
なぜならdeleteのとき100000個中の一個消すとくっそ遅いから。
var util = require('util'); var events = require('events'); var cls = function(){ this.n = 0; this.h = {}; }; util.inherits(cls, events.EventEmitter); cls.prototype.fire = function(){ this.emit('fire'); }; cls.prototype.create = function(){ var w = new X(++this.n); this.h[w.id] = w; return w; }; cls.prototype.delete = function(w){ delete this.h[w.id]; w.finalize(); }; cls.prototype.lookup = function(id){ return this.h[id]; }; var Singleton = (function(){ var instance = null; var getInstance = function(){ if(instance !== null){ return instance; } instance = new cls(); instance.setMaxListeners(10000); return instance; }; return { instance : getInstance, }; })(); var X = function(id){ this.initialize(id); }; X.prototype = { initialize : function(id){ this.id = id; this.cb = function(){ console.log("hoge %d",this.id); }.bind(this); Singleton.instance().on('fire',this.cb); }, finalize : function(){ Singleton.instance().removeListener('fire',this.cb); }, }; var w = Singleton.instance().create(); var p = Singleton.instance().lookup(w.id); Singleton.instance().delete(p);
※lookupいらないならハッシュで管理する必要ないけどサーバだとあったほうが便利。
サーバーまたぐときIDベースでやり取りできるし。