Wie deklariert man in node.js eine gemeinsam genutzte Variable, die vom Master-Prozess initialisiert werden kann und auf die Worker-Prozesse zugreifen können?

Ich möchte folgendes

Während des Startvorgangs lädt der Master-Prozess eine große Tabelle aus einer Datei und speichert sie in einer gemeinsam genutzten Variablen. Die Tabelle enthält 9 Spalten und 12 Millionen Zeilen mit einer Größe von 432 MB.Die Arbeitsprozesse führen einen HTTP-Server aus und akzeptieren Echtzeitabfragen für die große Tabelle.

Hier ist mein Code, der offensichtlich mein Ziel nicht erreicht.

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);
}

Ich habe versucht, die große Tabelle in MongoDB zu speichern, damit jeder Prozess leicht auf die Daten zugreifen kann. Die Tabellengröße ist jedoch so groß, dass MongoDB selbst mit einem Index etwa 10 Sekunden benötigt, um meine Abfrage abzuschließen. Dies ist zu langsam und für meine Echtzeitanwendung nicht akzeptabel. Ich habe auch versucht, Redis, die Daten im Speicher hält. Aber Redis ist ein Schlüsselwertspeicher und meine Daten sind eine Tabelle. Ich habe auch ein C ++ - Programm geschrieben, um die Daten in den Speicher zu laden, und die Abfrage dauerte weniger als 1 Sekunde. Daher möchte ich dies in node.js emulieren.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage