Dengan jumlah data yang begitu besar, saya akan mencoba menggunakan memori bersama daripada menyalin data ke dalam proses anak (yang terjadi saat Anda menggunakan pipa atau meneruskan pesan). Ini akan menghemat memori, mengurangi waktu CPU untuk proses induk, dan kemungkinan tidak akan mencapai batas tertentu.
shm-typed-array
adalah modul yang sangat sederhana yang tampaknya cocok untuk aplikasi Anda. Contoh:
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);
});
Perhatikan bahwa kami hanya mengirimkan "kunci" kecil dari induk ke proses anak melalui IPC, bukan seluruh data. Dengan demikian, kami menghemat banyak memori dan waktu.
Tentu saja, Anda dapat mengubah 'Float64Array'
(mis. double
) ke array yang diketik
apa pun aplikasi Anda membutuhkan. Perhatikan bahwa perpustakaan ini secara khusus hanya menangani array berdimensi tunggal; tapi itu seharusnya hanya menjadi kendala kecil.