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.