Med sådan en enorm mængde data ville jeg overveje at bruge delt hukommelse i stedet for at kopiere dataene ind i den underordnede proces (hvilket er det, der sker, når du bruger et rør eller sender beskeder). Dette vil spare hukommelse, tage mindre CPU-tid for den overordnede proces og sandsynligvis ikke støde ind i en eller anden grænse.
shm-typed-array
er et meget simpelt modul, der ser ud til at passe til din applikation. Eksempel:
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);
});
Bemærk, at vi kun sender en lille "nøgle" fra forælder til underordnet processen gennem IPC, ikke hele data. Således sparer vi masser af hukommelse og tid.
Selvfølgelig kan du ændre 'Float64Array'
(f.eks. en double
) til det indskrevne array
din ansøgning kræver. Bemærk, at dette bibliotek i særdeleshed kun håndterer enkeltdimensionelle type-arrays; men det burde kun være en mindre hindring.