Bei einer so großen Datenmenge würde ich die Verwendung von Shared Memory
shm-typed-array
ist ein sehr einfaches Modul, das für Ihre Anwendung geeignet erscheint. Beispiel:
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);
});
Beachten Sie, dass wir über IPC nur einen kleinen „Schlüssel“ vom übergeordneten zum untergeordneten Prozess senden, nicht die gesamten Daten. So sparen wir eine Menge Speicherplatz und Zeit.
Natürlich können Sie 'Float64Array'
ändern (z.B. ein double
) zu einem beliebigen typisierten Array
Ihre Anwendung erfordert. Beachten Sie, dass diese Bibliothek insbesondere nur eindimensionale typisierte Arrays verarbeitet; aber das sollte nur ein kleines Hindernis sein.