以下が欲しい
- 起動時に、マスター プロセスはファイルから大きなテーブルをロードし、それを共有変数に保存します。テーブルには 9 列と 1200 万行があり、サイズは 432MB です。
- ワーカー プロセスは HTTP サーバーを実行し、大きなテーブルに対するリアルタイムのクエリを受け入れます。
これが私のコードですが、明らかに私の目標を達成していません。
var my_shared_var;
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Load a large table from file and save it into my_shared_var,
// hoping the worker processes can access to this shared variable,
// so that the worker processes do not need to reload the table from file.
// The loading typically takes 15 seconds.
my_shared_var = load('path_to_my_large_table');
// Fork worker processes
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
// The following line of code actually outputs "undefined".
// It seems each process has its own copy of my_shared_var.
console.log(my_shared_var);
// Then perform query against my_shared_var.
// The query should be performed by worker processes,
// otherwise the master process will become bottleneck
var result = query(my_shared_var);
}
各プロセスがデータに簡単にアクセスできるように、大きなテーブルを MongoDB に保存しようとしました。しかし、テーブルのサイズが非常に大きいため、MongoDB がインデックスを使用してもクエリを完了するのに約 10 秒かかります。これは遅すぎて、私のリアルタイム アプリケーションには受け入れられません。データをメモリに保持する Redis も試しました。しかし、Redis はキーと値のストアであり、私のデータはテーブルです。データをメモリにロードする C++ プログラムも作成しましたが、クエリに 1 秒もかからなかったので、これを node.js でエミュレートしたいと考えています。