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.