Con una cantidad tan grande de datos, consideraría usar memoria compartida en lugar de copiar los datos en el proceso secundario (que es lo que sucede cuando usa una canalización o pasa mensajes). Esto ahorrará memoria, tomará menos tiempo de CPU para el proceso principal y es poco probable que se encuentre con algún límite.
shm-typed-array
es un módulo muy simple que parece adecuado para su aplicación. Ejemplo:
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);
niño.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);
});
Tenga en cuenta que solo enviamos una pequeña "clave" del proceso principal al secundario a través de IPC, no todos los datos. Así, ahorramos una tonelada de memoria y tiempo.
Por supuesto, puede cambiar 'Float64Array'
(por ejemplo, un double
) a cualquier matriz escrita
requiere su aplicación. Tenga en cuenta que esta biblioteca en particular solo maneja matrices tipadas unidimensionales; pero eso solo debería ser un obstáculo menor.