我想要以下
- 在启动期间,主进程从文件中加载一个大表并将其保存到一个共享变量中。该表有 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 中进行模拟。