MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Passar uma grande matriz para o processo filho do nó


Com uma quantidade tão grande de dados, eu gostaria de usar a memória compartilhada em vez de copiar os dados para o processo filho (que é o que está acontecendo quando você usa um pipe ou passa mensagens). Isso economizará memória, consumirá menos tempo de CPU para o processo pai e provavelmente não atingirá algum limite.

shm-typed-array é um módulo muito simples que parece adequado à sua aplicação. Exemplo:

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

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

Observe que estamos enviando apenas uma pequena "chave" do processo pai para o filho por meio do IPC, não os dados inteiros. Assim, economizamos uma tonelada de memória e tempo.

Claro, você pode alterar 'Float64Array' (por exemplo, um double ) para qualquer matriz digitada sua aplicação requer. Observe que esta biblioteca em particular só lida com arrays tipados unidimensionais; mas isso deve ser apenas um pequeno obstáculo.