MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Passer un grand tableau au processus enfant du nœud

Avec une telle quantité de données, j'envisagerais d'utiliser mémoire partagée plutôt que de copier les données dans le processus enfant (ce qui se passe lorsque vous utilisez un canal ou que vous transmettez des messages). Cela permettra d'économiser de la mémoire, de prendre moins de temps CPU pour le processus parent et il est peu probable que vous rencontriez une limite.

shm-typed-array est un module très simple qui semble adapté à votre application. Exemple :

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

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

Notez que nous n'envoyons qu'une petite "clé" du processus parent au processus enfant via IPC, pas l'ensemble des données. Ainsi, nous économisons une tonne de mémoire et de temps.

Bien sûr, vous pouvez modifier 'Float64Array' (par exemple un double ) à n'importe quel tableau typé votre application l'exige. Notez que cette bibliothèque en particulier ne gère que les tableaux typés unidimensionnels ; mais cela ne devrait être qu'un obstacle mineur.