MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Übergeben Sie ein großes Array an den untergeordneten Prozess des Knotens

Bei einer so großen Datenmenge würde ich die Verwendung von Shared Memory anstatt die Daten in den untergeordneten Prozess zu kopieren (was passiert, wenn Sie eine Pipe verwenden oder Nachrichten übergeben). Dies spart Speicher, benötigt weniger CPU-Zeit für den übergeordneten Prozess und stößt wahrscheinlich nicht auf ein Limit.

shm-typed-array ist ein sehr einfaches Modul, das für Ihre Anwendung geeignet erscheint. Beispiel:

parent.js

"use strict";

const shm = require('shm-typed-array');
const fork = require('child_process').fork;

// Create shared memory
const SIZE = 20000000;
const data = shm.create(SIZE, 'Float64Array');

// Fill with dummy data
Array.prototype.fill.call(data, 1);

// Spawn child, set up communication, and give shared memory
const child = fork("child.js");
child.on('message', sum => {
    console.log(`Got answer: ${sum}`);

    // Demo only; ideally you'd re-use the same child
    child.kill();
});
child.send(data.key);

child.js

"use strict";

const shm = require('shm-typed-array');

process.on('message', key => {
    // Get access to shared memory
    const data = shm.get(key, 'Float64Array');

    // Perform processing
    const sum = Array.prototype.reduce.call(data, (a, b) => a + b, 0);

    // Return processed data
    process.send(sum);
});

Beachten Sie, dass wir über IPC nur einen kleinen „Schlüssel“ vom übergeordneten zum untergeordneten Prozess senden, nicht die gesamten Daten. So sparen wir eine Menge Speicherplatz und Zeit.

Natürlich können Sie 'Float64Array' ändern (z.B. ein double ) zu einem beliebigen typisierten Array Ihre Anwendung erfordert. Beachten Sie, dass diese Bibliothek insbesondere nur eindimensionale typisierte Arrays verarbeitet; aber das sollte nur ein kleines Hindernis sein.