В node.js, как объявить общую переменную, которая может быть инициализирована с помощью мастер-процесса и доступ к рабочим процессам?

Я хочу следующее

  • Во время запуска, мастер-процесс загружает большую таблицу из файла и сохраняет его в общую переменную. Таблица имеет 9 столбцов и 12 миллионов строк, 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.

22
задан Jacky Lee 10 June 2012 в 00:33
поделиться