MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Passa un array di grandi dimensioni al processo figlio del nodo

Con una tale quantità di dati, valuterei l'utilizzo di memoria condivisa piuttosto che copiare i dati nel processo figlio (che è ciò che accade quando si utilizza una pipe o si passano messaggi). Ciò consentirà di risparmiare memoria, impiegare meno tempo della CPU per il processo padre ed è improbabile che raggiunga qualche limite.

shm-typed-array è un modulo molto semplice che sembra adatto alla tua applicazione. Esempio:

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

Nota che stiamo inviando solo una piccola "chiave" dal genitore al processo figlio tramite IPC, non tutti i dati. Così, risparmiamo un sacco di memoria e tempo.

Ovviamente puoi cambiare 'Float64Array' (es. un double ) a qualsiasi array tipizzato la tua applicazione richiede. Si noti che questa libreria in particolare gestisce solo array tipizzati unidimensionali; ma questo dovrebbe essere solo un piccolo ostacolo.