sql >> Databáze >  >> NoSQL >> MongoDB

Předat velké pole podřízenému procesu uzlu

S tak obrovským množstvím dat bych se podíval na použití sdílené paměti místo kopírování dat do podřízeného procesu (což se děje při použití kanálu nebo předávání zpráv). To ušetří paměť, zabere méně času CPU pro nadřazený proces a je nepravděpodobné, že narazí na nějaký limit.

shm-typed-array je velmi jednoduchý modul, který se zdá být vhodný pro vaši aplikaci. Příklad:

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

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

Všimněte si, že prostřednictvím IPC posíláme pouze malý „klíč“ z nadřazeného procesu podřízenému, nikoli celá data. Tím ušetříme spoustu paměti a času.

'Float64Array' samozřejmě můžete změnit (např. double ) na jakékoli pole typu vaše aplikace vyžaduje. Všimněte si, že tato knihovna konkrétně zpracovává pouze jednorozměrná typovaná pole; ale to by měla být jen malá překážka.



  1. Migrace dat z Oracle do Mongo DB

  2. Návrh tabulky MongoDB a výkon dotazů

  3. Serializujte jednu třídu dvěma různými způsoby s Jacksonem

  4. MongoDB vytáhne prvek z pole do hloubky dvou úrovní