Я хочу следующее
- Во время запуска главный процесс загружает большую таблицу из файла и сохраняет ее в общую переменную. Таблица имеет 9 столбцов и 12 миллионов строк, размер 432 МБ.
- Рабочие процессы запускают 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 - это хранилище ключей, а мои данные - таблица. Я также написал программу на С++ для загрузки данных в память, и запрос занял менее 1 секунды, поэтому я хочу эмулировать это в node.js.