Med en sådan enorm mängd data skulle jag överväga att använda delat minne istället för att kopiera data till den underordnade processen (vilket är vad som händer när du använder ett rör eller skickar meddelanden). Detta sparar minne, tar mindre CPU-tid för den överordnade processen och kommer sannolikt inte att stöta på någon gräns.
shm-typed-array
är en mycket enkel modul som verkar passa din applikation. Exempel:
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);
});
Observera att vi bara skickar en liten "nyckel" från föräldern till den underordnade processen via IPC, inte hela data. Således sparar vi massor av minne och tid.
Naturligtvis kan du ändra 'Float64Array'
(t.ex. en double
) till vilken skriven array
än din ansökan kräver. Observera att detta bibliotek i synnerhet endast hanterar endimensionella typmatriser; men det borde bara vara ett mindre hinder.