sql >> Base de Datos >  >> NoSQL >> MongoDB

Pase una matriz grande al proceso secundario del nodo

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.